¿Por qué los nombres de atributos no pueden ser palabras clave de Python?

Hay una restricción en la syntax del acceso a los atributos, en Python (al menos en la implementación de CPython 2.7.2):

>>> class C(object): pass >>> o = C() >>> ox = 123 # Works >>> o.if = 123 o.if = 123 ^ SyntaxError: invalid syntax 

Mi pregunta es doble:

  1. ¿Hay alguna razón fundamental por la que se prohíba el uso de nombres de atributos de palabras clave de Python (como en o.if = 123 )?
  2. ¿Se documenta / dónde se documenta la restricción anterior sobre los nombres de atributos?

Tendría sentido hacer o.class = … , en uno de mis progtwigs, y estoy un poco decepcionado por no poder hacerlo ( o.class_ funcionaría, pero no parece tan simple).

PD : el problema es obviamente que if y class son palabras clave de Python. La pregunta es por qué se prohibiría el uso de palabras clave como nombres de atributos (no veo ninguna ambigüedad en la expresión o.class = 123 ), y si esto está documentado .

Related of "¿Por qué los nombres de atributos no pueden ser palabras clave de Python?"

Debido a que el analizador es más simple cuando las palabras clave son siempre palabras clave y no contextuales (por ejemplo, if es una palabra clave cuando se encuentra en el nivel de la statement, pero solo es un identificador cuando está dentro de una expresión; y for se usa en listas de comprensión y expresiones generadoras).

Por lo tanto, el código ni siquiera llega al punto en el que hay acceso a los atributos, simplemente lo rechaza el analizador, simplemente como una sangría incorrecta (por lo que es un SyntaxError y no un SyntaxError AttributeError o algo así). No diferencia si se usa como nombre de atributo, nombre de variable, nombre de función o nombre de tipo. Nunca puede ser un identificador, simplemente porque el analizador siempre le asigna la etiqueta de “palabra clave” y la convierte en un token diferente a los identificadores.

Es lo mismo en la mayoría de los idiomas, y la gramática del lenguaje (especificación de + lexer) es la documentación para eso. Las especificaciones del lenguaje lo mencionan explícitamente . Tampoco cambia en Python 3.

Además, solo porque puedes usar setattr o __dict__ para hacer un atributo con un nombre reservado, no significa que __dict__ hacerlo. No se obligue a usted mismo / al usuario de la API a usar getattr lugar del acceso a atributos naturales. getattr debe reservarse para cuando se necesita acceso a un nombre de atributo variable.

Porque if es una palabra clave. Tiene problemas similares con o.while y o.for :

 pax> python >>> class C(object): pass ... >>> o = C() >>> o.not_a_keyword = 123 >>> o.if = 123 File "", line 1 o.if = 123 ^ SyntaxError: invalid syntax >>> o.while = 123 File "", line 1 o.while = 123 ^ SyntaxError: invalid syntax >>> o.for = 123 File "", line 1 o.for = 123 ^ SyntaxError: invalid syntax 

Otras palabras clave en Python se pueden obtener con:

 >>> import keyword >>> keyword.kwlist ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'] 

Generalmente, no debe usar una palabra clave como nombre de variable en Python.

Sugeriría elegir un nombre más descriptivo, como iface si es una interfaz, o infld para un campo de entrada y así sucesivamente.

En cuanto a su pregunta, edite por qué las palabras clave no están permitidas, simplifica los analizadores en gran medida si los elementos léxicos no tienen contexto. Tener que tratar el token léxico if como una palabra clave en algunos lugares y un identificador en otros introduciría una complejidad que no es realmente necesaria si elige sus identificadores más sabiamente.

Por ejemplo, la statement de C ++:

 long int int = char[new - int]; 

podría (con un poco de dificultad) ser evaluado con un analizador complejo basado en dónde ocurren esos elementos léxicos (y lo que existe a cada lado de ellos). Pero, (al menos parcialmente) en aras de la simplicidad (y la legibilidad), esto no se hace.