Re: [pyar] si se ve como un pato y suena como un pato...

Página superior
Adjuntos:
+ (text/plain)
+ (text/html)
+ (text/plain)
Eliminar este mensaje
Responder a este mensaje
Autor: Claudio Freire
Fecha:  
A: Python Argentina
Asunto: Re: [pyar] si se ve como un pato y suena como un pato...
2010/10/6 Nicolas Echaniz <>

> 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
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/