Attribute, die keine gültigen Python-IDs sind

8

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:

%Vor%

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%     
wim 23.10.2014, 18:15
quelle

2 Antworten

0

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.

    
wim 22.06.2017, 02:24
quelle
1

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.

  1. Sie möchten, dass ein Objekt ein Attribut besitzt, auf das nicht mit Punktnotation zugegriffen werden kann, um es beispielsweise vor dem naiven Benutzer zu schützen. (Zitat Guido: "Einige Leute könnten dies verwenden, um den Status zu verbergen, den sie nicht mit der regulären Attributnotation (x.foo) zugänglich machen möchten." Natürlich fährt er fort zu sagen, "aber das fühlt sich wie Missbrauch des Namensraums an und es gibt viele andere Möglichkeiten, diesen Zustand zu verwalten. ")
  2. Sie möchten, dass die Attributnamen eines Objekts externen Daten entsprechen, über die Sie keine Kontrolle haben. Daher müssen Sie in der Lage sein, beliebige Zeichenfolgen in den externen Daten als Attributnamen zu verwenden, auch wenn sie einem reservierten Python-Wort entsprechen oder eingebettete Leerzeichen oder Bindestriche usw. enthalten.
Tom Barron 18.02.2015 14:40
quelle

Tags und Links