Warum können Namen keine Python-Schlüsselwörter sein?

8

Es gibt eine Einschränkung für die Syntax des Attributzugriffs in Python (zumindest in der CPython 2.7.2-Implementierung):

%Vor%

Meine Frage ist zweifach:

  1. Gibt es einen fundamentalen Grund, warum die Verwendung von Python-Schlüsselwortattributnamen (wie in o.if = 123 ) verboten ist?
  2. Ist / wo ist die obige Einschränkung für Attributnamen dokumentiert?

Es wäre sinnvoll, o.class = … in einem meiner Programme zu machen, und ich bin ein wenig enttäuscht, dass ich das nicht kann ( o.class_ würde funktionieren, aber es sieht nicht so einfach aus).

PS : Das Problem ist offensichtlich, dass if und class Python-Schlüsselwörter sind. Die Frage ist warum das Verwenden von Schlüsselwörtern als Attributnamen verboten wäre (ich sehe keine Mehrdeutigkeit im Ausdruck o.class = 123 ) und ob dies dokumentiert ist .

    
EOL 17.03.2012, 02:51
quelle

3 Antworten

7

Weil Parser einfacher ist, wenn Schlüsselwörter immer Schlüsselwörter sind und nicht kontextabhängig (zB if ist ein Schlüsselwort auf der Anweisungsebene, aber nur ein Bezeichner innerhalb eines Ausdrucks) - für if wäre es doppelt schwer, weil von X if C else Y und for wird in Listen-Comprehensions und Generator-Ausdrücken verwendet.

Also kommt der Code nicht einmal an den Punkt, wo es einen Attributzugriff gibt, er wird einfach vom Parser zurückgewiesen, genau wie ein falscher Einzug (deshalb ist es ein SyntaxError und nicht AttributeError oder etwas). Es wird nicht unterschieden, ob if als Attributname, Variablenname, Funktionsname oder Typname verwendet wird. Es kann niemals ein Bezeichner sein, nur weil der Parser ihm immer eine "Schlüsselwort" -Etikette zuweist und es zu einem anderen Token als Bezeichnern macht.

In den meisten Sprachen ist es dasselbe, und die Grammatik für die Sprache (+ Lexer-Spezifikation) ist die Dokumentation dafür. Sprachspezifikation erwähnt dies ausdrücklich . Es ändert sich auch nicht in Python 3.

Auch wenn Sie setattr oder __dict__ verwenden können, um ein Attribut mit einem reservierten Namen zu erstellen, bedeutet das nicht, dass Sie sollten . Erzwinge dir / API-Benutzer nicht, getattr anstelle von Zugriff auf natürliche Attribute zu verwenden. getattr sollte reserviert werden, wenn der Zugriff auf einen Variablenattributnamen benötigt wird.

    
Cat Plus Plus 17.03.2012, 04:28
quelle
3

Ich denke nicht, dass if als Variablenname oder Attribut (explizit) verwendet werden kann, da es ein Schlüsselwort ist.

Sie können jedoch setattr und getattr verwenden, um dies auf unordentliche Weise zu umgehen

%Vor%     
Blender 17.03.2012 02:57
quelle
1

Weil if ein Schlüsselwort ist. Sie haben ähnliche Probleme mit o.while und o.for :

%Vor%

Andere Schlüsselwörter in Python können erhalten mit:

%Vor%

Sie sollten nicht generell ein Schlüsselwort als Variablennamen in Python verwenden.

Ich würde vorschlagen, einen aussagekräftigeren Namen zu wählen, zB iface , wenn es eine Schnittstelle ist, oder infld für ein Eingabefeld und so weiter.

Was Ihre Frage betrifft, wie warum Schlüsselwörter nicht erlaubt sind, vereinfacht es Parser sehr, wenn die lexikalischen Elemente kontextfrei sind. Das lexikalische Token if muss an einigen Stellen als Schlüsselwort behandelt werden und ein Bezeichner in anderen würde eine Komplexität mit sich bringen, die nicht wirklich benötigt wird, wenn Sie Ihre Bezeichner weise auswählen.

Zum Beispiel die C ++ - Anweisung:

%Vor%

könnte (mit ein wenig Schwierigkeit) mit einem komplexen Parser ausgewertet werden, basierend darauf, wo diese lexikalischen Elemente vorkommen (und was auf jeder Seite von ihnen existiert). Aber (zumindest teilweise) im Interesse der Einfachheit (und Lesbarkeit) wird dies nicht gemacht.

    
paxdiablo 17.03.2012 02:53
quelle

Tags und Links