Für die übliche Methode des Attributzugriffs müssen Attributnamen gültige Python-IDs sein.
Aber Attribute müssen keine gültigen Python-IDs sein:
%Vor% Natürlich bleibt t.0potato
ein SyntaxError
, aber das Attribut ist trotzdem da:
Was ist der Grund dafür? Gibt es wirklich einen gültigen Anwendungsfall für Attribute mit Leerzeichen, leeren Strings, reservierten Python-Stichwörtern usw.? Ich dachte der Grund war, dass Attribute nur Schlüssel im Objekt / Namespace dict waren, aber das macht keinen Sinn, weil andere Objekte, die gültige dict keys sind, nicht erlaubt sind:
%Vor%Die Details aus einem Kommentar zum Beitrag beantworten dies vollständig Frage, also poste ich es als Antwort:
Guido sagt:
... es ist ein Feature , dass Sie eine beliebige Zeichenfolge verwenden können mit getattr () und setattr (). Diese Funktionen sollten (und tun!) Nicht-Strings ablehnen.
Mögliche Anwendungsfälle sind das Ausblenden von Attributen aus dem regulären gepunkteten Zugriff und das Erstellen von Attributen in Übereinstimmung mit externen Datenquellen (die mit Python-Schlüsselwörtern kollidieren können). Das Argument scheint also zu sein, dass es einfach keinen guten Grund gibt, es zu verbieten.
Für einen Grund, Nicht-Strings zu verbieten, scheint dies eine sinnvolle Einschränkung zu sein, die eine höhere Leistung der Implementierung gewährleistet:
Obwohl Pythons Dicts bereits einige reine String-Optimierungen enthalten, passen sie sich dynamisch an einen generischen und etwas langsameren Ansatz an, sobald der erste Nicht-Schlüssel-String auftaucht.
Um die Use-Case-Frage zu beantworten und die Gründe dafür zu untersuchen, wie Python in den Referenzen aus den obigen Kommentaren funktioniert, können wir einige der Situationen ableiten, die diese pythonische Eigenart nützlich machen könnten.
Tags und Links python attributes