27

有没有更紧凑/有效的方法来做到这一点?

    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]
4

7 回答 7

48

要完全实现您的要求,您可以使用

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

虽然这仍然有些重复,但代码确实很容易阅读。无论是否传入相应的关键字参数,所有属性都被初始化,并且函数的签名清楚地记录了参数和默认值。

于 2011-04-11T17:12:50.207 回答
27
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.

于 2011-04-11T17:13:46.787 回答
9

如果提供的键get()不在字典中,则结果为None.

self.log = kwargs.get('log')
self.bin = kwargs.get('bin')
self.pid = kwargs.get('pid')
self.conf = kwargs.get('conf')
于 2011-04-11T17:12:50.277 回答
4
for k,v in kwarg.iteritems():
   setattr(self, k, v)

在这setattr(self, "bin", "val")就像打电话self.bin = "val"

然而,拥有像@Sven Marnach 这样的白名单更为可取。

于 2011-04-11T17:14:42.000 回答
2
for k,v in kw.items():
   setattr(self, k, v)
于 2011-04-11T17:12:44.660 回答
0

self.__dict__.update(kwargs)

于 2011-04-11T17:13:13.233 回答
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))
于 2021-03-01T13:07:58.367 回答