В этом ответе показано, как автоматически установить в качестве атрибута kwargs / args передан в класс __init__
Например, можно было сделать:
class Employee(object):
def __init__(self, *initial_data, **kwargs):
# EDIT
self._allowed_attrs = ['name', 'surname', 'salary', 'address', 'phone', 'mail']
for dictionary in initial_data:
for key in dictionary:
if key in self._allowed_attrs: # EDIT
setattr(self, key, dictionary[key])
for key in kwargs:
if key in self._allowed_attrs: # EDIT
setattr(self, key, kwargs[key])
В моем случае я уже заранее знаю аргументы, которые собираюсь передать, поэтому я рассматриваю это решение только для того, чтобы иметь менее повторяющийся и более короткий код.
Считается ли это хорошей практикой? Какие плюсы и минусы этого решения против инициализации каждого атрибута вручную? Есть ли другой предпочтительный подход?
РЕДАКТИРОВАТЬ: Поскольку первые комментарии / ответы (правильно) сосредоточены на очистке аргументов или перечислении аргументов, я думаю, что это может быть довольно легко решено в этой структуре.
Explicit is better than implicit.
. Вы требуете, чтобы вызывающий абонент связал*args
в словарь. - person AChampion   schedule 12.04.2017Sparse is better than dense
,hard to explain
и т. Д. В целом я бы не одобрил этот подход. - person AChampion   schedule 12.04.2017for dictionary in initial_data
пахнет рыбой.*args
- это список произвольных объектов, переданных в качестве аргументов, а не список dicts. Таким образом, это приведет к сбою, если все переданные аргументы, не являющиеся ключевыми словами, не являются dicts. - person ivan_pozdeev   schedule 19.04.2017