Python 3.7: Утилита классов данных и SimpleNameSpace - PullRequest
0 голосов
/ 28 июня 2018

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?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

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

Dataclasses

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

SimpleNamespace

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

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

SimpleNamespace может быть полезным в качестве замены class NS: pass. Однако для структурированного типа записи используйте namedtuple().

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

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

0 голосов
/ 29 июня 2018

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

Почему?

  1. Использование PEP 526 для обеспечения простого способа определения таких классов.
  2. Для поддержки проверки статического типа.

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

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

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

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

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

Тем не менее, то же самое относится и к SimpleNameSpace, так что еще мы можем посмотреть, чтобы принять решение? Давайте подробнее рассмотрим дополнительные возможности, предоставляемые классами данных ...

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

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

Затем документы Python говорят, что он обеспечивает простую реализацию __init__, __repr__ и __eq__. Сравнивая это с PEP 557, классы данных также дают вам варианты:

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

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

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

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

...