2010/10/6 Nicolas Echaniz <
nico@rakar.com>
> Todo andaba bonito, hasta que nos cruzamos con un caso en el que alguien
> intenta llamar a float(settings.PAGINATION) y revienta diciendo que float
> necesita un número o un string como parámetro.
>
El problema es que float() es un builtin hecho en C.
No sigue las reglas del código usual de python, y puede (y lo hace) mirar la
clase exacta que se le pasa.
En general con hacer float(str(...)) es suficiente, pues str() va a llamar a
__str__ en tu proxy.
En general, la interfaz de C de python (Python/C) suele acceder a campos
específicos en las clases nuevas que definen los métodos especiales. O sea,
los métodos especiales no se obtienen con getattr, sino que son campos
específicos dentro de Py_Type que se setean al crear la clase. Eso hace que
extensiones en C y builtins no reaccionen como el resto del código python a
esas magias.
Ciertamente, la única forma que tenés de solucionarlo es la que
implementaste: definir explícitamente todos los métodos especiales. Son
muchos, hay bastante boilerplate... pero se puede automatizar:
for methname in [ m for m in dir(int) if m.startswith('__') ]:
locals()[methname] = lambda self : <<tu getattr>>
Y listo :D
Tenés todos los métodos especiales de int. Repetir (con algo más de
inteligencia capaz) con float, etc, etc... y listo.
(no lo probé, capaz que explota en algún lado, pero bue)
_______________________________________________
pyar mailing list
pyar@python.org.ar
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web:
http://www.python.org.ar/