Короткий ответ: все это покрывается PEP 557 . Устраняя ваши вопросы немного не по порядку ...
Зачем?
- Чтобы использовать PEP 526, чтобы обеспечить простой способ определения таких классов.
- Для поддержки элементов статического типа.
Как выбрать, когда их использовать?
PEP совершенно ясно, что они не являются заменой и ожидают, что другие решения будут иметь свое собственное место.
Как и любое другое дизайнерское решение, вам нужно будет точно определить, какие функции вам интересны. Если это включает в себя следующее, вы определенно не хотите dataclasses.
Где нецелесообразно использовать классы данных?
Совместимость API с кортежами или диктофонами. Требуется подтверждение типа, превышающее значение, предоставленное PEP 484 и 526, или требуется проверка или преобразование стоимости.
Тем не менее, то же самое верно для __init__, так что еще мы можем рассмотреть, чтобы решить? Давайте подробнее рассмотрим дополнительные функции, предоставляемые dataclasses ...
Существующее определение __repr__ выглядит следующим образом:
Простой объектный подкласс, который предоставляет доступ к атрибуту для своего пространства имен, а также значимое резюме.
Питон документы затем продолжают говорить , что он обеспечивает простую __eq__
, namedtuple
и SimpleNamespace
реализацию. Сравнивая это с PEP 557, dataclasses также дают вам варианты для:
- упорядочение - сравнение класса, как если бы оно было кортежем его полей, по порядку.
- неизменяемость - при назначении полям генерируется исключение
- управление хешированием - хотя это не рекомендуется.
Ясно, что тогда вы должны использовать dataclasses, если вы заботитесь о заказе или неизменяемости (или нуждаетесь в управлении хешированием ниши).
Другие варианты использования?
Нет, что я могу видеть, хотя вы можете утверждать, что первоначальный «почему?» охватывает другие варианты использования.