#python-3.x #python-dataclasses
#python-3.x #python-классы данных
Вопрос:
Я хочу использовать типы Union
и Optional
при создании класса данных. Могу ли я безопасно использовать эти типы?
Например.:
@dataclass
class Car:
year: int
owner: Optional[str]
engine: Union[Engine1, Engine2]
Комментарии:
1. Аннотациями может быть любое выражение python . Что вы подразумеваете под «безопасно»?
2. В документации к
dataclasses
модулю и различных руководствах в Интернете используются только «простые» типы, такие какstr
,float
,int
, SomeClass,Any
.3. В качестве дополнительного примечания, если вы хотите убедиться, что ваши подсказки по типу верны, вам следует использовать средство проверки типов, такое как mypy , pyre или pyright .
Ответ №1:
Да, вы можете. Во-первых, аннотации в python сами по себе ничего не делают. Из других языков можно ожидать, что объявление переменной как int
приведет к ошибке, если она создается, скажем, в виде строки, но в python это просто не так.
Аннотации используются только сторонними библиотеками или инструментами, такими как ваша IDE, когда она дает вам подсказки или mypy
когда она выполняет статический анализ типа вашего кода.
Итак, вы должны использовать своего рода аннотации, с которыми хорошо работают ваши инструменты, и, исходя из моего личного опыта, это означало бы использовать аннотации типов из typing
модуля поверх базовых типов.
Хотя нет декларативного заявления о том, что вы должны использовать, вот поток, в котором обсуждаются типы классов данных по умолчанию, включая ericvsmith (автор модуля dataclasses) и gvanrossum (автор python), и они согласны с тем, что typing.Any
следует предпочесть object
.
Я предполагаю, что документация dataclass использует базовые типы python, чтобы не обременять читателя слишком большим объемом знаний. В конце концов, вы можете прекрасно использовать классы данных, ничего не зная о typing
модуле, и как только вы освоитесь с тем, как работают классы данных, вы, вероятно, столкнетесь с дополнительными возможностями использования typing
аннотаций и оцените их в любом случае.