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