select case

Rafael Villar Burke pachi en mmn-arquitectos.com
Vie Abr 22 12:46:27 CEST 2005


Pepe Aracil wrote:

>Lo del "is" no lo tengo tan claro. Por alguna razón de optimización , funciona 
>con enteros del 0 a 99, lo que puede resultar algo confuso y podría cambiar 
>en futuras versiones o implementaciones de python.
>  
>
Cierto, hablé demasiado a la ligera :)... los números en general no son 
el caso más afortunado. Seguramente que por cuestiones de optimización 
no se mantienen como verdaderos objetos en memoria, salvo en un rango 
pequeño (el más útil). En un caso ideal todos serían objetos singulares 
(singleton). Si nos volvemos locos con la velocidad también merece la 
pena ver esto: 
http://mail.python.org/pipermail/python-dev/2002-January/019113.html

Otros consejos que me gustaron, y que tratan sobre expresiones como:
if x == 0, if x == "", if x == None, if x == False, etc...
es http://jaynes.colorado.edu/PythonIdioms.html

De todos modos, para los casos en los que tenemos ese tipo de objetos 
únicos (objetos de estado, None, True o False, etc), es más rápida una 
comparación de referencias de memoria que una comprobación de igualdad, 
y la sintaxis de 'is' creo que recalca más la identidad. En el PEP-8 se 
habla en algunos párrafos de estas cosas.

También pensaba que en C el uso de enteros se hace con un valor 
semántico que no necesariamente debe trasladarse a python. En C es 
frecuente crear enumeraciones y operar luego con sus símbolos como 
enteros. De la misma manera muchas constantes se implementan como 
enteros únicos, etc. Es, por ello, normal que cuando se ha visto eso mil 
veces se repita en python, cuando en éste a menudo la implementación se 
hará a través de objetos y no enteros (pensados como no objetos). Por 
ejemplo, si se hace una asignación múltiple a un conjunto de nombres 
desde un rango se puede usar cada nombre como una instancia de la clase 
int y usar esos nombres de la manera que explicaba para el select, con 
'is'. En el caso de None esto ya parece natural, pero se puede extender 
a los objetos que creemos en nuestros programas.

Así, con select, es frecuente que la comparación sea con valores 
inmutables, que, si se usan en diferentes puntos del código, sería 
recomendable que apareciesen a traves de un nombre y no de su valor. 
Esto permite modificar su valor en el futuro actuando en un solo punto; 
recalcar que no se trata meramente de coincidencia de valor, sino de un 
mismo contenido semántico, etc.

Bueno, esto es lo que he ido pensando sobre el asunto. Si se busca en 
google por "python identity equality" hay unas 16500 entradas y muchas 
muy interesantes.
Me gusta cuando la gente de la lista cuenta lo que ha ido experimentando 
y pensando a raíz de su trabajo con python. :).

Saludos,

Pachi
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es