有更紧凑/有效的方法吗?
for key in kwargs:
if key == 'log':
self.log = kwargs[key]
elif key == 'bin':
self.bin = kwargs[key]
elif key == 'pid':
self.pid = kwargs[key]
elif key == 'conf':
self.conf = kwargs[key]
答案 0 :(得分:38)
为了达到您的要求,您可以使用
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
虽然这仍然有些重复,但代码非常容易阅读。所有属性都是关于是否传入相应关键字参数的初始关系,并且函数的签名清楚地记录了参数并且存在默认值。
答案 1 :(得分:23)
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
。
答案 2 :(得分:5)
如果get()
中提供的密钥不在字典中,则结果为None
。
self.log = kwargs.get('log')
self.bin = kwargs.get('bin')
self.pid = kwargs.get('pid')
self.conf = kwargs.get('conf')
答案 3 :(得分:2)
for k,v in kw.items():
setattr(self, k, v)
答案 4 :(得分:2)
for k,v in kwarg.iteritems():
setattr(self, k, v)
其中setattr(self, "bin", "val")
就像调用self.bin = "val"
然而,像@Sven Marnach这样的白名单更为可取。
答案 5 :(得分:0)
self.__dict__.update(kwargs)
答案 6 :(得分:0)
我的解决方案是:
for key in ('log', 'bin', 'pid', 'conf'):
setattr(self, key, kwargs.get(key, None))
在这种模式下,所有属性都被初始化。
当我有大量属性时,我更喜欢像这样创建一个更易于阅读的列表:
kwargs_list = [
"log",
"bin",
"pin",
"conf"
]
for key in kwargs_list:
setattr(self, key, kwargs.get(key, None))