Я только начал использовать модуль attrs
для python, который довольно гладкий (или аналогичным образом мы могли бы использовать Python 3.7 DataClasses). Обычный шаблон использования, который у меня есть, заключается в том, чтобы класс был контейнером для значений параметров. Мне нравится маркировка, когда я назначаю параметры, и более чистая ссылка на значения атрибутов в стиле атрибутов, но мне также нравится иметь несколько функций, которые хороши при хранении значений в чем-то вроде упорядоченного dict:
*
распаковка как tuple
или list
для подачи в аргументы функции
**
распаковка, когда необходимо или желательно передать ключевое слово.
Я могу достичь всего этого, добавив три метода в класс
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
def keys(self):
return 'A', 'alpha', 'c', 'k', 'M_s'
def __getitem__(self, key):
return getattr(self, key)
def __iter__(self):
return (getattr(self, x) for x in self.keys())
Тогда я могу использовать такие классы, как это:
params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *params, 300)
result2 = function2(x=1, y=2, **params)
Мотивация здесь заключается в том, что классы данных обеспечивают удобство и ясность. Однако есть причины, по которым я не знаю, какой модуль я пишу для использования класса данных. Желательно, чтобы вызовы функций принимали простые аргументы, а не сложные классы данных.
Приведенный выше код в порядке, но мне интересно, если я что-то упустил, что позволило бы мне вообще пропустить написание функций, поскольку шаблон довольно ясен. Атрибуты добавляются в том порядке, в котором я хотел бы их распаковывать, и могут быть прочитаны как пары ключ-значение на основе имени атрибута для аргументов ключевого слова.
Может быть, это что-то вроде:
@addtupleanddictunpacking
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
но я не уверен, что в самом attrs
есть что-то такое, что я не нашел. Кроме того, я не уверен, как бы сохранить порядок атрибутов при их добавлении и перевести это в метод ключей как таковой.