Kwargs разбор наилучшей практики

Вы должны использовать Регулярные выражения для проверки адресов электронной почты.

21
задан nnachefski 11 April 2011 в 17:10
поделиться

6 ответов

Для достижения именно того, о чем вы просили, вы можете использовать

for key in ('log', 'bin', 'pid', 'conf'):
    if key in kwargs:
        setattr(self, key, kwargs[key])

или

self.__dict__.update((key, kwargs[key])
                     for key in ('log', 'bin', 'pid', 'conf')
                     if key in kwargs)

Однако я бы предпочел что-то вроде этого:

def f(log=None, bin=None, pid=None, conf=None):
    self.log = log
    self.bin = bin
    self.pid = pid
    self.conf = conf

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

38
ответ дан Sven Marnach 11 April 2011 в 17:10
поделиться

Если ключ, указанный в get(), отсутствует в словаре, результат будет None.

self.log = kwargs.get('log')
self.bin = kwargs.get('bin')
self.pid = kwargs.get('pid')
self.conf = kwargs.get('conf')
5
ответ дан Andrew Clark 11 April 2011 в 17:10
поделиться
for k,v in kw.items():
   setattr(self, k, v)
2
ответ дан Andreas Jung 11 April 2011 в 17:10
поделиться
for k,v in kwarg.iteritems():
   setattr(self, k, v)

В котором setattr(self, "bin", "val") похоже на вызов self.bin = "val"

Однако более желательно иметь белый список, как у @Sven Marnach.

2
ответ дан Mike Lewis 11 April 2011 в 17:10
поделиться

self.__dict__.update(kwargs)

0
ответ дан lazy1 11 April 2011 в 17:10
поделиться
self.log = kwargs.get('log', default_log)
self.bin = kwargs.get('bin', default_bin)
self.pid = kwargs.get('pid', default_pid)
self.conf = kwargs.get('conf', default_conf)

Это имеет дополнительное преимущество, заключающееся в том, что self.log назначается в любом случае (AttributeError означает, что ваш код сломан до чертиков, ничего более. Всегда проверяйте, что все всегда назначено.). Без лишних self.log = default_log строк. Вы можете опустить значение по умолчанию, чтобы получить None.

23
ответ дан 11 April 2011 в 17:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: