TypedDict
було прийнято в Python 3.8 через PEP 589 . З Python з'являється __total__
булевий прапор, встановлений True
за замовчуванням:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
Як вже згадувалося в інших публікаціях, деталі щодо цього методу обмежені у документах , але посилання @Yann Vernier на вихідний код CPython настійно підказує, що __total__
це стосується нового total
ключового слова, введеного в 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
...
Як це працює?
Короткий огляд : за замовчуванням всі кнопки потрібні при створенні інстанції визначеного TypedDict
. total=False
скасовує це обмеження та дозволяє додаткові клавіші. Дивіться наступну демонстрацію.
Дано
Дерево тестового каталогу:

Код
Файли в тестовому каталозі:
# 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"
Демо
Якщо ключ відсутній, mypy скаржиться на командний рядок:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
Налаштування total=False
дозволів додаткових ключів:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
Дивись також
- Твіт від Р. Хеттінгера, що демонструє сукупність
- Розділ PEP про сукупність у PEP 589
- Стаття Розділ про типи та
TypedDict
на Python 3.8 від Real Python
typing-extensions
пакет для використання TypedDict
в Python 3.5, 3.6
typing
внутрішніх справ не задокументовані, а частина, яка є задокументована, погано.