Dudas con palabras reservadas
Rafael Villar Burke
pachi en rvburke.com
Mie Mayo 30 16:48:03 CEST 2007
Luis Miguel Morillas wrote:
> ¿cuáles son las palabras reservadas de python? las que aparecen en
> keyword.kwlist?
> ¿Por qué ahí no aparecen True, False, None por ejemplo?
> ¿Por qué podemos hacer asignaciones a True y False y no a None? ¿Tiene
> sentido?
Sin conocer la implementación de estos casos, se me ocurren varias
razones para que no sean palabras reservadas.
a) True y False pueden ser etiquetas "predeterminadas" que se
corresponden a dos valores opuestos en una expresión booleana.
Por otro lado, la lógica del lenguaje no cambiaría si las expresiones
booleanas devolviesen 2 en lugar de True, o [] en lugar de False.
>>> True
True
>>> int(True)
1
>>> True=2
>>> print True
2
>>> 2>1
True
>>> True=0
>>> if(True):
... print "verdadero"
... else:
... print "no verdadero"
...
no verdadero
>>>
b) None también puede ser una etiqueta práctica para apuntar a un objeto
singleton de sólo lectura "predeterminado", al que apuntan por defecto
las etiquetas u otros elementos no inicializados.
El utilizar un objeto así tiene sus ventajas, especialmente para segurar
la existencia de una identidad inmutable, pero no es la única opción. Si
mal no recuerdo, hasta hace un tiempo los valores enteros pequeños no
necesariamente eran singleton, y se podía dar una situación en la que
a=1;b=1; no hacía cumplir a is b.
Al tratarse de un singleton y de lectura, es lógico que no se permita
mutarlo.
c) Tampoco 1, 2, 3 son palabras reservadas, sino literales con valor
aritmético. En ese sentido, None, True y False pueden compartir en parte
el carácter de 'literales'.
Esto en realidad significa que, dentro de todo el rango de papeles
semánticos y sintácticos que puede tener un identificador en un
lenguaje, hay muchos matices, no solo la de "valor" e "instrucción" u
"operador".
Otro ejemplo claro es el self, con valor semántico por convención.
Fijarlo como palabra reservada no aporta ninguna ventaja clara ni define
más estrictamente el lenguaje.
>>> 2 ='dos'
SyntaxError: can't assing to literal
>>>
>>> class prueba:
... def __init__(uno):
... uno.valor=1
...
>>> a = prueba()
>>> print a.valor
1
>>>
Saludos,
Rafael Villar Burke
Más información sobre la lista de distribución Python-es