In neu veröffentlichtem Python 3.8 gibt es eine neue Typanmerkung typing.TypedDict
. In seiner Dokumentation wird dies erwähnt
Auf die Typinformationen für die Selbstbeobachtung kann über
Point2D.__annotations__
und zugegriffen werdenPoint2D.__total__
. [....]
Obwohl __annotations__
bekannt, dass ich in PEP 3107 eingeführt wurde , kann ich keine Informationen zu finden __total__
. Könnte jemand seine Bedeutung erklären und wenn möglich auf maßgebliche Quellen verweisen?
python
python-3.x
python-typing
Antti Haapala
quelle
quelle
typing
Interna sind nicht dokumentiert, und der Teil, der schlecht dokumentiert ist.Antworten:
Ich vermute, dass das
__total__
Feld angibt, ob Instanzen vollständig sein müssen (Standardeinstellung) oder nicht (alle Felder optional). Ich begann meine Suche bei PEP 589 , dasTypedDict
die Totalität als solche einführte und beschrieb. Es wurde eintotal
Argument verwendet, das sinnvoll wäre, den Dunder-Stil für dieclass
Syntax umzubenennen . Ich habe jedoch nicht herausgefunden, wann eine solche Umbenennung stattgefunden hat.Bei MyPy, dem eigentlichen Typprüfer, der sich um diese Anmerkungen kümmert, gibt es eine ähnliche Dokumentation
TypedDict
und Gesamtheit , aber auch hier keinen Verweis auf die Dunder-Syntax. DasTypedDictType
Eingraben in die Implementierung führte zu mehr Verwirrung, da in types.py kein Gesamtfeld vorhanden ist, sondern separateitems
undrequired_keys
. Totalität würde dies implizieren,items.keys()==required_keys
aber die Implementierung macht andere Annahmen, wiecan_be_false
sichitems
allein zu verlassen.total=False
sollte im prinzip bedeutenrequired_keys
ist leer.Die CPython-Quelle für _TypedDictMeta zeigt zumindest, dass das
total
Argument und der__total__
Dunder ein und dasselbe sind, obwohl die Quelle sichTypedDict
selbst als "kann bald hinzugefügt werden" beschreibt.quelle
can_be_false
dass es sich um einen MyPy-Fehler handelt, der möglicherweise darauf zurückzuführen ist, dass von Anfang an keine optionalen Felder geplant waren.TypedDict
wurde in Python 3.8 über PEP 589 akzeptiert . In Python scheint__total__
es sich um ein boolesches Flag zu handeln, dasTrue
standardmäßig auf Folgendes gesetzt ist :Wie in anderen Beiträgen erwähnt, sind Details zu dieser Methode in den Dokumenten begrenzt , aber der Link von @Yann Vernier zum CPython-Quellcode deutet stark darauf hin, dass er
__total__
mit dem in Python 3.8 eingeführten neuentotal
Schlüsselwort zusammenhängt :Wie funktioniert es?
Synopsis : Standardmäßig sind alle Schlüssel erforderlich, um eine definierte Instanz zu instanziieren
TypedDict
.total=False
überschreibt diese Einschränkung und erlaubt optionale Schlüssel. Siehe die folgende Demonstration.Gegeben
Ein Testverzeichnisbaum:
Code
Dateien im Testverzeichnis:
Demo
Wenn ein Schlüssel fehlt, beschwert sich mypy über die Befehlszeile:
Die Einstellung
total=False
erlaubt optionale Schlüssel:Siehe auch
TypedDict
in Python 3.8 von Real Pythontyping-extensions
Paket zur VerwendungTypedDict
in Python 3.5, 3.6quelle