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 удовлетворения?

2 ответов


короткий ответ заключается в том, что все это покрыто PEP 557. Слегка нарушаю порядок ваших вопросов...

почему?

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

файла dataclasses

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

SimpleNamespace

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

С SimpleNamespace документы:

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

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

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