Нет, с помощью typing
(PEP 484 и PEP 526) вы не можете объявить, что в контейнере должен присутствовать определенный ключ.Все, что вы можете объявить - это types , а не содержимое среды выполнения.'x'
- это конкретное строковое значение , а не тип.
Я знаю, что вы конкретно не хотите этого делать, но, возможно, ответ - рассмотреть другую структуру данных, такую как именованный кортеж или класс данных, где вы можете указать атрибут, который имеет тип.
Вот что действительно делает объявление машинописного текста:
Функция printLabel
имеет единственный параметр, который требует, чтобы переданный объект имел свойство label
типа string.
Атрибуты Python являются моральным эквивалентом свойств объекта Typescript.То, что нотация объектов Typescript и словари Python имеют много общего, возможно, сбивает с толку вопросы, но вы не должны рассматривать объявления объектов Typescript как что-либо, кроме классов, когда пытаетесь отобразить концепции на Python.
mypy
действительно включает расширениядо typing
, которые выходят за пределы стандарта хинтинга типа Python.Это включает в себя mypy_extensions.TypeDict
объект , который работает так же, как объявление typing.TypeVar
:
from mypy_extensions import TypedDict
SomeDict = TypeDict('SomeDict', {'x': str})
def f(d: SomeDict) -> None:
x = d['x']
print(x)
или использование синтаксиса на основе классов:
class SomeDict(TypeDict)
x: str
Ключи в объявлении TypeDict
являются либо обязательными, либо необязательными (если вы указали total=False
в объявлении);вам придется использовать наследование, чтобы создать тип с некоторыми необязательными ключами, см. документацию по ссылке.
Но учтите, что TypeDict
является экспериментальным и может быть отброшен снова или радикально изменен в будущем выпуске Mypy и недоступен в других средствах проверки подсказок типов Python.