[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