В недавно выпущенном Python 3.8 появилась аннотация нового типа typing.TypedDict
. В его документации упоминается, что
Информация о типе для самоанализа может быть доступна через
Point2D.__annotations__
иPoint2D.__total__
. [....]
Хотя __annotations__
общеизвестно, что, будучи введенным в PEP 3107 , я не могу найти никакой информации о __total__
. Может ли кто-нибудь объяснить его значение и, если возможно, ссылки на авторитетные источники?
python
python-3.x
python-typing
Антти Хаапала
источник
источник
typing
внутренних органов не документированы, а часть документирована плохо.Ответы:
Я предполагаю, что
__total__
поле указывает, должны ли экземпляры быть полными (по умолчанию) или нет (все поля необязательны). Я начал свой поиск в PEP 589 , который представилTypedDict
и описывает совокупность как таковую. В нем использовалсяtotal
аргумент, который имело бы смысл переименовать вclass
синтаксисе в стиле dunder . Однако я не нашел, когда произошло такое переименование.Если посмотреть на MyPy, которая является средством проверки типов, которое заботится об этих аннотациях, то есть аналогичная документация
TypedDict
и совокупность , но опять же нет ссылки на синтаксис dunder. Копание в его реализации привело к еще большей путанице, так какTypedDictType
в types.py нет общего поля, но есть отдельныеitems
иrequired_keys
. Совокупность подразумевает это,items.keys()==required_keys
но реализация делает разные предположения, такие какcan_be_false
полагаться наitems
одного.total=False
должно в принципе значитrequired_keys
пусто.Исходный код CPython для _TypedDictMeta, по крайней мере, показывает, что
total
аргумент и__total__
dunder - одно и то же, хотя источник описываетTypedDict
себя как «может быть добавлен в ближайшее время».источник
can_be_false
что это ошибка MyPy, возможно связанная с тем, что с самого начала не планировалось иметь дополнительные поля.TypedDict
был принят в Python 3.8 через PEP 589 . Начиная с Python, это__total__
логический флаг, установленныйTrue
по умолчанию:Как упоминалось в других публикациях, подробности этого метода в документах ограничены , но ссылка @Yann Vernier на исходный код CPython настоятельно указывает
__total__
на новоеtotal
ключевое слово, введенное в Python 3.8 :Как это работает?
Сводка : по умолчанию все ключи требуются при создании экземпляра определенного
TypedDict
.total=False
отменяет это ограничение и разрешает дополнительные ключи. Смотрите следующую демонстрацию.Данный
Тестовое дерево каталогов:
Код
Файлы в тестовой директории:
демонстрация
Если ключ отсутствует, mypy будет жаловаться в командной строке:
Настройка
total=False
разрешений необязательных ключей:Смотрите также
TypedDict
в Python 3.8 от Real Pythontyping-extensions
пакет для использованияTypedDict
в Python 3.5, 3.6источник