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

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

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

Meine Frage ist zweifach:

  • Python 3: Können wir vermeiden, einen Instanznamen zu wiederholen, wenn wir mehrere seiner Methoden anrufen?
  • Zugriff auf das Funktionsattribut, das in einem Dekorateur außerhalb dieses Dekorators erstellt wurde
  • "AttributeError: exp" bei der Verwendung von numpy.exp () auf einem scheinbar gewöhnlichen Array
  • Wie stelle ich Berechtigungen (Attribute) auf eine Datei in einer ZIP-Datei mit dem Zipfile-Modul von Python ein?
  • Eigenschaften "Private" in Python
  • Verständnis __getattribute__
    1. Gibt es einen fundamentalen Grund, warum die Verwendung von Python-Keyword-Attributnamen (wie in o.if = 123 ) verboten ist?
    2. Ist / Wo ist die obige Einschränkung auf Attributnamen dokumentiert?

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

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

  • Wie fügt man dem pythonpath in windows 7 hinzu?
  • 3 Solutions collect form web for “Warum können keine Namen Namen Python Schlüsselwörter?”

    Denn Parser ist einfacher, wenn Schlüsselwörter immer Schlüsselwörter sind und nicht kontextuell (zB if ein Schlüsselwort ist, wenn auf der Anweisungsebene, sondern nur eine Kennung, wenn in einem Ausdruck – denn if es doppelt so schwer wäre, weil X if C else Y , Und wird in Listenverständnissen und Generatorausdrücken verwendet).

    So kommt der Code nicht einmal auf den Punkt, wo es Attribut Zugriff, es ist einfach vom Parser abgelehnt, genau wie falsche Einrückung (weshalb es ist ein SyntaxError , und nicht AttributeError oder etwas). Es unterscheidet nicht, ob Sie if als Attributname, einen Variablennamen, einen Funktionsnamen oder einen Typnamen verwenden. Es kann niemals ein Bezeichner sein, nur weil der Parser ihm immer das "Keyword" -Label zuweist und es zu einem anderen Token macht als Identifikatoren.

    Es ist das gleiche in den meisten Sprachen, und die Sprachgrammatik (+ lexer Spezifikation) ist die Dokumentation dafür. Sprachspezifikation erwähnt es explizit . Es ändert sich auch nicht in Python 3.

    Auch, nur weil Sie setattr oder __dict__ , um ein Attribut mit einem reservierten Namen zu machen, bedeutet nicht, dass Sie sollten . getattr Sie sich nicht / API Benutzer, getattr anstelle von natürlichem Attributzugriff zu verwenden. getattr sollte reserviert werden, wenn der Zugriff auf einen Variablenattributnamen erforderlich ist.

    Ich glaube nicht, if man als Variablennamen oder ein Attribut (explizit) verwenden kann, da es sich um ein Keyword handelt.

    Sie können jedoch setattr und getattr , um dies in einer unordentlichen Weise zu bekommen

     >>> class C(object): pass ... >>> o = C() >>> setattr(o, 'if', 123) >>> getattr(o, 'if') 123 

    Denn if ist ein Stichwort. Sie haben ähnliche Probleme mit o.while und o.for :

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

    Weitere Stichworte in Python können mit:

     >>> 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'] 

    Sie sollten in der Regel kein Schlüsselwort als Variablenname in Python verwenden.

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

    Wie bei deiner Frage zu bearbeiten, warum Schlüsselwörter nicht erlaubt sind, vereinfacht es die Parser sehr, wenn die lexikalischen Elemente kontextfrei sind. Um das lexikalische Token zu behandeln, if ein Schlüsselwort an einigen Stellen und ein Bezeichner in anderen eine Komplexität einführen würde, die nicht wirklich benötigt wird, wenn Sie Ihre Identifikatoren sinnvoller wählen.

    Zum Beispiel die C ++ – Anweisung:

     long int int = char[new - int]; 

    (Mit ein wenig Schwierigkeit) mit einem komplexen Parser ausgewertet werden, der darauf basiert, wo diese lexikalischen Elemente auftreten (und was auf beiden Seiten besteht). Aber, (zumindest teilweise) im Interesse der Einfachheit (und Lesbarkeit), ist dies nicht getan.

    Python ist die beste Programmiersprache der Welt.