Articles of metaprogramming

Crea un tipo de pareja con nombre personalizado con características adicionales

Me gustaría crear mi propio tipo de complemento con nombre que tenga algunas características adicionales. Digamos que creamos una clase: from collections import namedtuple MyClass = namedtuple(‘MyClass’, ‘field1 field2’) Es inmutable, legible y simple. Ahora puedo crear instancias de MyClass: myobj = MyClass(field1 = 1, field2 = 3.0) print(myobj.field1, myobj.field2) Mi requisito adicional es cuando […]

¿Puedo definir un __repr__ para una clase en lugar de una instancia?

¿Puedo definir un __repr__ para una clase en lugar de una instancia? Por ejemplo, estoy tratando de hacer esto class A(object): @classmethod def __repr__(cls): return ‘My class %s’ % cls Lo que obtengo es In [58]: a=A() In [59]: a Out[59]: My class In [60]: A Out[60]: __main__.A Estoy intentando que la salida de la […]

¿Por qué eval () de Python rechaza esta cadena multilínea y cómo puedo solucionarlo?

Estoy intentando evaluar la siguiente cadena con sangría de tabulación: ”’for index in range(10): os.system(“echo ” + str(index) + “”) ”’ Me sale, “Hubo un error: syntax no válida, línea 1” ¿De qué se queja? ¿Debo hacer sangría para coincidir con la sentencia eval (), o escribirla en un archivo de cadena o archivo temporal […]

¿Qué es el atributo python get y set order?

Python nos ofrece muchas posibilidades en el atributo de instancia / clase, por ejemplo: class A(object): def __init__(self): self.foo = “hello” a = A() Hay muchas formas de acceder / cambiar el valor de self.foo : acceso directo a.foo dictado interno a.__dict__[‘foo’] obtener y establecer a.__get__ y a.__set__ , por supuesto, hay dos métodos predefinidos. […]

¿Por qué no puedo pasar yo mismo como un argumento con nombre a un método de instancia en Python?

Esto funciona: >>> def bar(x, y): … print x, y … >>> bar(y=3, x=1) 1 3 Y esto funciona: >>> class Foo(object): … def bar(self, x, y): … print x, y … >>> z = Foo() >>> z.bar(y=3, x=1) 1 3 E incluso esto funciona: >>> Foo.bar(z, y=3, x=1) 1 3 Pero ¿por qué no […]

¿Por qué los cambios de Python 3 para que exec rompa este código?

Miré a través de los innumerables hilos de ‘Python exec‘ en SO, pero no pude encontrar uno que respondiera a mi problema. Lo siento mucho si esto se ha preguntado antes. Aquí está mi problema: # Python 2.6: prints ‘it is working’ # Python 3.1.2: “NameError: global name ‘a_func’ is not defined” class Testing(object): def […]

Python equivalente de Ruby ‘method_missing’

¿Cuál es el equivalente de Python del método de method_missing método de Ruby? Intenté usar __getattr__ pero este enganche se aplica también a los campos. Solo quiero interceptar las invocaciones del método. ¿Cuál es la forma Python de hacerlo?

setattr y getattr con métodos

Tengo una clase de plato de caldera que delega algunas acciones a una clase de referencia. Se parece a esto: class MyClass(): def __init__(self, someClass): self.refClass = someClass def action1(self): self.refClass.action1() def action2(self): self.refClass.action2() def action3(self): self.refClass.action3() Esta es la clase de referencia: class RefClass(): def __init__(self): self.myClass = MyClass(self) def action1(self): #Stuff to execute […]

Sqlalchemy crea dinámicamente la tabla y la clase asignada

Dado un conjunto de nombres de columna y sus tipos, el objective es para instanciar una tabla y la clase asignada correspondiente. Está relacionado con la pregunta publicada aquí: Creación dinámica de clases en SQLAlchemy . Hasta ahora tengo lo siguiente: table = Table(tbl, metadata, *(Column(col, ctype, primary_key=pk, index=idx) for col, ctype, pk, idx in […]

Dado un método, ¿cómo devuelvo la clase a la que pertenece en Python 3.3 en adelante?

Dado x = Cf después de: class C: def f(self): pass ¿A qué llamo en x que devolverá C ? Lo mejor que pude hacer es exec una parte analizada de x.__qualname__ , que es feo: exec(‘d = ‘ + “.”.join(x.__qualname__.split(‘.’)[:-1])) Para un caso de uso, imagine que quiero un decorador que agregue una super […]