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:
o.if = 123
) verboten ist? 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 .
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.
Weil if
ein Schlüsselwort ist. Sie haben ähnliche Probleme mit o.while
und o.for
:
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.
Tags und Links python attributes syntax-error