Ich verwende Python 3.6.1 und bin auf etwas sehr Seltsames gestoßen. Ich hatte einen einfachen Tippfehler bei der Wörterbuchzuweisung, für dessen Suche ich lange gebraucht habe.
context = {}
context["a"]: 2
print(context)
Ausgabe
{}
Was macht der Code context["a"]: 2
? Es wird nicht ausgelöst, SyntaxError
wann es IMO sollte. Zuerst dachte ich, es würde eine Scheibe erzeugen. Durch Eingabe wird jedoch a repr(context["a"]: 2)
ausgelöst SyntaxError
. Ich habe auch context["a"]: 2
die Konsole eingegeben und die Konsole hat nichts gedruckt. Ich dachte, vielleicht ist es zurückgekehrt None
, aber ich bin mir nicht so sicher.
Ich habe auch gedacht, dass es eine einzelne Zeile if-Anweisung sein könnte, aber das sollte auch nicht die richtige Syntax sein.
Zusätzlich context["a"]
sollte a KeyError
.
Ich bin ratlos. Was ist los?
quelle
Antworten:
Sie haben versehentlich eine syntaktisch korrekte Variablenanmerkung geschrieben . Diese Funktion wurde in Python 3.6 eingeführt (siehe PEP 526 ).
Obwohl eine variable Annotation als Teil einer annotierten Zuweisung analysiert wird , ist die Zuweisungsanweisung optional :
Also in
context["a"]: 2
context["a"]
ist das Anmerkungsziel2
ist die Anmerkung selbstcontext["a"]
wird nicht initialisiertDas PEP gibt an, dass "das Ziel der Annotation zumindest syntaktisch ein beliebiges gültiges Einzelzuweisungsziel sein kann (es ist Sache der Typprüfung, was damit zu tun ist)" , was bedeutet, dass der Schlüssel nicht vorhanden sein muss kommentiert (daher nein
KeyError
). Hier ist ein Beispiel aus dem ursprünglichen PEP:Normalerweise ist die Annotation Ausdruck sollte auf einen Python - Typen bewerten - schließlich die hauptsächliche Verwendung von Annotationen Type Hinting ist, aber es wird nicht erzwungen. Die Annotation kann ein beliebiger gültiger Python-Ausdruck sein, unabhängig vom Typ oder Wert des Ergebnisses.
Wie Sie sehen können, sind Typhinweise derzeit sehr freizügig und selten nützlich, es sei denn, Sie haben eine statische Typprüfung wie mypy .
quelle
=
dann keinen Zuweisungsoperator erfordern ? Der Schlüssel existiert nicht. Das fühlt sich für mich einfach falsch an.:
ist der Zuweisungsoperator. Wir "weisen" nur eine Typanmerkung allein zu, keinen Schlüssel. Ich bezweifle, dass es einen Grund gibt, dies zuzulassen, nur einen unbeabsichtigten Nebeneffekt beim Hinzufügen der Anmerkungssyntax.x: str
und unmittelbar darauf folgttype(x)
, wird der Dolmetscher a auslösenNameError
. IMO sollte die Syntax erzwingen, dass das Objekt vordefiniert oder vor Ort definiert ist. Dies führt nur zu Verwirrung.x = 'i am a string'
vorx: str
der letzteren Art überflüssig macht .. Dies sollte wurde überhaupt nicht gegeben. Es war gut als Kommentar; Ich zeige nie, dass es so oder so benutzt wird.