[pyar] si se ve como un pato y suena como un pato...
Claudio Freire
klaussfreire en gmail.com
Mie Oct 6 14:12:47 ART 2010
2010/10/6 Nicolas Echaniz <nico en 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)
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20101006/4be9a347/attachment.html>
More information about the pyar
mailing list