Могу ли я использовать объединяющий и необязательный типы из модуля ввода при создании класса данных?

#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 аннотаций и оцените их в любом случае.