« first day (3323 days earlier)      last day (52 days later) » 

06:54
A las güenas :-)
Asco de miércoles :-(
 
9 hours later…
15:50
0
Q: Establecer métodos mágicos como alias a métodos en otras clases

TraumaSe que puedo hacer esto: class A: def p( self, msg ): print( msg ) class B: def __init__( self, a: A ): self._p = a.p def __call__( self, msg ): self._p( msg ) a = A( ) b = B( a ) b( "Probando ..." ) Lo cual es una manera de hacer un alias del método A.p. ...

Ale, a ver si algún alma generosa se anima :-)
16:02
@Trauma ¿Cual es el problema con definir "call"?
Alguien participa de adventofcode?
@Trauma Puedes definir una clase base que haga la llamada, y luego derivas B de esa clase base.
La única ventaja de esta solución es que puedes definir múltiples subclases, ninguna de las cuales implementa la llamada (que es delegada a la clase base). Si te sirve, puedo publicar una respuesta.
class A:
    def p( self, msg ):
        print( msg )

class Base:
    def __init__(self, x):
        self._p = x.p

    def __call__(self, msg):
        self._p(msg)
class B (Base):
    def __init__( self, a: A ):
        super().__init__(a)
O podrías simplemente usar class B(A):
16:18
@Trauma yo creo que el setattr no funciona porque la función que asignas a call no tiene parámetro self.
Tal vez con una meta clase o como dijo Candid
__setattr__() se usa para manejar los casos en que asignas un valor a un atributo que no existe. Es decir, resuelve el caso cuando haces b.precio = 10 en un objeto que no tiene (en ese momento) definido el precio.
@CandidMoe Lo que quiero es que python no tenga que hacer la búsqueda del atributo 2 veces, 1 vez en Base y otra vez en A
Tengo Sender = Callable[[msg],None] en todas partes, así que necesito algo que cumpla con eso, que haga de proxy para el verdadero método, que está en la clase A
@Mateo ese cual es?? porque hay como 3000
@Trauma Es posible agregar métodos después de crear la instancia. Revisa ianlewis.org/en/…
16:31
@Trauma mejor usa C o tal vez el lenguaje que usaron para Golfscript, Ruby?
@Mateo python
class A:
    def p( self, msg ):
        print( msg )

class B:
    def __init__( self, a: A ):
        type( self ).__call__ = a.p

a = A( )
b = B( a )

b( "Probando ..." )
Pues no era tan difícil xD
¿ Alguien que responda mi pregunta ? Me da pereza hacerlo yo xD
Tiene +25 asegurados :-)
También sirve con
class B:
    def __init__( self, a: A ):
        B.__call__ = a.p
No me gusta la solución. Es más claro y obvio definir call directamente.
Si, claro
Pero ya te comenté que no quiero que python busque 2 veces
Alguien que mira el código no se va a dar cuenta que tienes definido ese método.
Que igual es lo que realmente pasa, pero al menos no hay código ejecutable entre medias
@CandidMoe jejeje ... Eso es problema de otro
Ya sabes, Asco de día y tal
¡ Anda ! Pues tengo un bonito error en la ejecución
16:42
Recuerda que "Simple is better than complex." (Zen de Python)
Lo siento, pero me cuesta ungüebo soltar los buenos hábitos de C++
Muchos años haciendo perrerias de las guapas
@Trauma Ahora corre un profile sobre el código original y sobre la solución y ve cual es la diferencia.
@CandidMoe El error que tengo te encantaría :-)
Si dejo el def __call__( ), todo funciona Ok
Si aplico los cambios, cuando llama a la instancia real que implementa el método, es como si estuviera llamando a una instancia distinta: le faltas variables internas
:-O
Chulo XD
Vamos a probar con el MethodType ese
Ah carajo, ya se lo que le pasa XDDDD
Hago Clase.__call__ = Base.method
Pero eso setea __call__ para todas las instancias de la clase Clase
Tengo varias instancias, y todas intentan usar la misma instancia de Base, cuando cada instancia debería usar una instancia de Base concreta xDD
@Trauma Obvio, asignaste a la clase.
jejeje
enga, a seguir experimentando :-D
@CandidMoe Estas cositas son las que dan alegría al día xDD
16:54
Debería asignar a la instancia.
Ya, pero entonces no la encuentra
no encuentra el __call__ seteado, y dice que la clase no lo tiene
Voy a probar con una clausura, a ver
a ver si recibo o no un self
Tanto esfuerzo y complicación por algo que posiblemente no tenga beneficio.
Ya :-D
Pero mola ungüebo investigar estas cositas, hombre :-D
@Trauma Publica ese ejemplo.
@CandidMoe Es el que tengo en la pregunta
0
Q: Establecer métodos mágicos como alias a métodos en otras clases

TraumaSe que puedo hacer esto: class A: def p( self, msg ): print( msg ) class B: def __init__( self, a: A ): self._p = a.p def __call__( self, msg ): self._p( msg ) a = A( ) b = B( a ) b( "Probando ..." ) Lo cual es una manera de hacer un alias del método A.p. ...

Con eso puedes trastear :-)
Bueno, se acabó el horario laboral. Ahora, un poquito de JavaScript
Salgo y entro
Ya volví
17:06
@Trauma. Tu supones que Python hace una doble búsqueda. Me parece que no es cierto. Yo díria que cuando haces `self._p = a.p` Python resuelve de inmediato la referencia al método final y la asigna directamente.
Te puedes dar cuenta pues si luego redefine A.p, la clase B sigue llamando al método original.
Si es así, puedo dejar el def call
Voy a hacer alguna pruebecilla mas, porsiaca
class A:
    def p( self, msg ):
        print( msg )

class B:
    def __init__( self, a: A ):
        self._p = a.p

    def __call__( self, msg ):
        self._p( msg )

a = A( )
b = B( a )

b( "Probando ..." )

def newp(self, msg):
    print("---", msg)

A.p = newp
b( "Probando ..." )

c = B(a)
c("Probando ... ")
produce
Probando ...
Probando ...
--- Probando ...
Como vez, la referencia queda resuelta y fija. Aunque cambies el método, la instancia b sigue referenciando el método original
Vale, te lo compro
Dejaré el def __call__
Pero reconoce que ha estado chulo trastear un rato xD
No se como lo hara C++. Talvez tenga catorce alternativas distintas de resolución.
No no. Solo usas un puntero y listo
Parecido a como lo hace python, pero sin buscar __call__
17:12
@Trauma tiene sus problemas. Qué pasa si instancias B de nuevo y el parámetro a es otra función?
@Trauma ¿Y eso de métodos virtuales, finales y no se que más .. ?
todo es estático en C++, conocido en tiempo de compilación
@Mateo Eso no sirve, ya lo vimos :-)
@CandidMoe si te refieres a los métodos virtuales, se hace mediante una vtable
@CandidMoe Es un doble puntero. Mas latazo, pero estático igualmente
@Trauma Y por qué no implementas tu clase en C++ con pybind tal vez?
17:14
Que no. Que tiene que ser python a-pelo xDD
Es en el curro. Es lo que hay :-/
Opino que es un problema XY
@CandidMoe Si, tienes razón
Por cierto, no veas el trabajito que me costó sacar excepciones de un hilo hacia el principal
ojito, porque el hilo que las generaba estaba usando el loop de asyncio
@Trauma y por qué no querés definir la función call en B?
@Mateo Para que python no tuviera que buscar 2 veces en un diccionario: una para __call__ y otra para p
Ya hemos visto que p no se busca, se resuelve al asignar
Osea, que como dice @CandidMoe, mi problema realmente no existe
Solo busca 1 identificador, que es lo que yo quería
Enga, ahora cambiamos a JavaScript. Reintentos infinitos de fetch( ) en una función async xDD
Si es que me lo paso pipa xDDD
Si lo piensas, es mucho más simple escribir un intérprete que resuelve las referencias de inmediato. Lo único que tiene que almacenar es la referencia. Si en cambio deja la expresión, tiene que guardarla y evaluarla cada vez que aparezca durante la ejecución. Eso si que es complicarse la vida.
17:24
Bueno, tiene la ventaja de que si cambias el target, cambias lo que hace
Puede servir para hacer un proxy de un proxy
... que no tengo ni pajolera idea de para que serviría, pero bueno ...
Se supone que Python compila el código a un lenguaje intermedio, a lo Java
Por lo menos en las últimas versiones
eso no afecta
simplemente compilas a un byte-code que haga la busqueda
@Mateo Apostaría que hoy en día todos los interpretes generan byte-code para una máquina virtual. Eso hace fácil la portabilidad.
@Trauma Cobol tiene una instrucción ALTER que te permite cambiar el destino de un GOTO. Super nice: miras que la instrucción dice GOTO IMPRIMIR sin darte cuenta que en algun punto durante la ejecución se ejecutó un ALTER IMPRIMIR TO SALIR y ahora el GOTO salta a otra parte.
@CandidMoe No conozco Cobol, pero tiene que ser divertido mantener código así
MUY divertido xD
Bueno, y mi super-mega-chachi-piruly fetch con teintentos ... pues como que no reintenta XDD
claro, no reintenta porque las promesas fallan dentro del Promise que se devuelve, y eso ya está fuera de mi try ... catch
mola bastante el JavaScript este jejeje
@Trauma IBM/360 tiene una instruccion "Branch and Link" que te permite parchar la instrucción justo antes de ejecutarla, sin modificarla en memoria. Nice, nice
17:39
¿ En que caso se usaría la instrucción esa ? No me lo imagino
@Trauma Ya ni me acuerdo. Los IBM no tiene stack ...
¿ No tienen ? ¿ Y como haces llamadas a funciones ? Mas exactamente, como retornan de llamadas a funciones O_o
17:56
@Trauma En el caso de IBM, dejas la dirección de retorno en un registro pre-acordado. Luego la rutina hace un salto via registro. Olvidate de recursividad o reentrancia.
@CandidMoe Bueno, por lo menos depurar seria sencillo. Nada de seguir la pila, buscando en que función metiste la pata xDD
18:20
@Mateo ese no lo conocia...
 
3 hours later…
21:36
@gbianchi Ya me olvide ¿Qué se hacía con las respuestas chatGPT?
0
Q: Kong no escucha el puerto 8000

BoomcherTengo un proyecto de microservicios en gcp. Kong es un apigateway utilizando docker. Cuando inicio el docker y pongo a correr alguna maquina de los servicios. AL ingresar a http con la ipExterna del kong y el puerto 8000 con su respectiva ruta no carga. Ademas, cuando realizo este comando sobre e...

Siete respuestas en la última hora
@CandidMoe se reportan...
21:53
@gbianchi ¿Con cual opción de la lista?
@CandidMoe ya lo suspendi...
@CandidMoe se necestia la intervencion de un moderador era la opcion...
22:35
@CandidMoe qué largo
23:31
Kubi, 2023, una película de samurais del tiempo justo antes de Shogun. Son personajes y situaciones históricas.
Es lo más brutal que he visto en años. Realmente hay que tener estómago, pues es un reguero de muertes a diestra y sinistra, condimentados con una alta dosis de sadismo y crueldad. Aquí la vida no vale nada, y se matan unos a otros como si de aplastar un mosquito se tratara.
No creo que haya una película con más muertos que esta.
También un montón de personajes (todos históricos) y se hace díficil seguirlos.

« first day (3323 days earlier)      last day (52 days later) »