TypedDict
è stato accettato in Python 3.8 tramite PEP 589 . Da Python, sembra che __total__
sia un flag booleano impostato di True
default:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
Come menzionato in altri post, i dettagli su questo metodo sono limitati nei documenti , ma il link di @Yann Vernier al codice sorgente di CPython suggerisce fortemente che __total__
è correlato alla nuova total
parola chiave introdotta in Python 3.8 :
# 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
...
Come funziona?
Sinossi : per impostazione predefinita, tutte le chiavi sono necessarie quando si crea un'istanza di un definito TypedDict
. total=False
ignora questa limitazione e consente chiavi opzionali. Vedi la seguente dimostrazione.
Dato
Un albero di directory di test:
Codice
File nella directory di test:
# 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"
dimostrazione
Se manca una chiave, mypy si lamenterà dalla riga di comando:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
L'impostazione total=False
consente i tasti opzionali:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
Guarda anche
typing
interni non è documentato e la parte che è documentata è scarsamente documentata.