Python 3.7: Утилита Dataclasses и SimpleNameSpace

Python 3.7 предоставляет новые, dataclassesкоторые имеют предопределенные специальные функции.

Из обзорной точки dataclassesи SimpleNameSpaceоба обеспечивают хороший инкапсулирующий объект.

@dataclass
class MyData:
    name:str
    age: int

data_1 = MyData(name = 'JohnDoe' , age = 23)

data_2 = SimpleNameSpace(name = 'JohnDoe' , age = 23)

Много раз я использую SimpleNameSpaceтолько для переноса данных и перемещения их.

Я даже подклассифицирую его, чтобы добавить специальные функции:

from types import SimpleNameSpace

class NewSimpleNameSpace(SimpleNameSpace):
    def __hash__(self):
        return some_hashing_func(self.__dict__)

По моему вопросу:

  1. Как кто-то выбирает между SimpleNameSpaceи dataclasses?
  2. Почему они были необходимы, когда тот же эффект может быть достигнут с расширением SimpleNameSpace?
  3. Каковы все другие варианты использования dataclasses?

python,python-3.7,python-dataclasses,

13

Ответов: 2


4 принят

Короткий ответ: все это покрывается PEP 557 . Устраняя ваши вопросы немного не по порядку ...

Зачем?

  1. Чтобы использовать PEP 526, чтобы обеспечить простой способ определения таких классов.
  2. Для поддержки элементов статического типа.

Как выбрать, когда их использовать?

PEP совершенно ясно, что они не являются заменой и ожидают, что другие решения будут иметь свое собственное место.

Как и любое другое дизайнерское решение, вам нужно будет точно определить, какие функции вам интересны. Если это включает в себя следующее, вы определенно не хотите dataclasses.

Где нецелесообразно использовать классы данных?

Совместимость API с кортежами или диктофонами. Требуется подтверждение типа, превышающее значение, предоставленное PEP 484 и 526, или требуется проверка или преобразование стоимости.

Тем не менее, то же самое верно для __init__, так что еще мы можем рассмотреть, чтобы решить? Давайте подробнее рассмотрим дополнительные функции, предоставляемые dataclasses ...

Существующее определение __repr__ выглядит следующим образом:

Простой объектный подкласс, который предоставляет доступ к атрибуту для своего пространства имен, а также значимое резюме.

Питон документы затем продолжают говорить , что он обеспечивает простую __eq__, namedtupleи SimpleNamespaceреализацию. Сравнивая это с PEP 557, dataclasses также дают вам варианты для:

  • упорядочение - сравнение класса, как если бы оно было кортежем его полей, по порядку.
  • неизменяемость - при назначении полям генерируется исключение
  • управление хешированием - хотя это не рекомендуется.

Ясно, что тогда вы должны использовать dataclasses, если вы заботитесь о заказе или неизменяемости (или нуждаетесь в управлении хешированием ниши).

Другие варианты использования?

Нет, что я могу видеть, хотя вы можете утверждать, что первоначальный «почему?» охватывает другие варианты использования.


3

Dataclasses больше похож __init__на популярный пакет attrs , чем __hash__(который даже не упоминается в PEP ). Они служат двум различным намеченным целям.

Dataclasses

  • структурированная
  • Набирается (по умолчанию, но необязательно)
  • Пишет большую часть шаблонного для основных методов Dunder ( __eq__, __slots__, __slots__, и многое другое)
  • Обеспечьте простой механизм для значений по умолчанию для атрибутов
  • Можно легко добавить SimpleNamespaceи методы

SimpleNamespace

  • Структура данных "Grab bag"
  • Используется там, где вам нужно больше, чем словарь, но меньше класса
  • Не предназначено для использования таких вещей, как class NS: pass

Из SimpleNamespaceдокументации:

SimpleNamespace может быть полезна для замены namedtuple(). Однако @dataclassвместо этого используется тип структурированной записи .

Поскольку namedtupleпредполагается заменить многие варианты использования @dataclass, названные записи / структуры должны выполняться SimpleNamespaceне с SimpleNamespace.

Вы также можете посмотреть на этот разговор PyCon Раймондом Хеттингером , где он заходит в прошлое @dataclassи использует его.

Python, Python-3.7, Python-dataclasses,
Похожие вопросы