TypedDict
wurde in Python 3.8 über PEP 589 akzeptiert . In Python scheint __total__
es sich um ein boolesches Flag zu handeln, das True
standardmäßig auf Folgendes gesetzt ist :
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
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 neuen total
Schlüsselwort zusammenhängt :
# cypthon/typing.py
class _TypedDictMeta(type):
def __new__(cls, name, bases, ns, total=True):
"""Create new typed dict class object.
...
"""
...
if not hasattr(tp_dict, '__total__'):
tp_dict.__total__ = total
...
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:
# rgb_bad.py
from typing import TypedDict
class Color(TypedDict):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
# rgb_good.py
from typing import TypedDict
class Color(TypedDict, total=False):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
Demo
Wenn ein Schlüssel fehlt, beschwert sich mypy über die Befehlszeile:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
Die Einstellung total=False
erlaubt optionale Schlüssel:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
Siehe auch
- Tweet von R. Hettinger demonstriert die Totalität
- PEP- Abschnitt zur Gesamtheit in PEP 589
- Artikel Abschnitt über Typen und
TypedDict
in Python 3.8 von Real Python
typing-extensions
Paket zur Verwendung TypedDict
in Python 3.5, 3.6
typing
Interna sind nicht dokumentiert, und der Teil, der schlecht dokumentiert ist.