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