kwargs解析最佳实​​践

nna*_*ski 22 python kwargs

有更紧凑/有效的方法吗?

    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]
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 39

为了达到你要求的目的,你可以使用

for key in ('log', 'bin', 'pid', 'conf'):
    if key in kwargs:
        setattr(self, key, kwargs[key])
Run Code Online (Sandbox Code Playgroud)

要么

self.__dict__.update((key, kwargs[key])
                     for key in ('log', 'bin', 'pid', 'conf')
                     if key in kwargs)
Run Code Online (Sandbox Code Playgroud)

但是,我通常会喜欢这样的东西:

def f(log=None, bin=None, pid=None, conf=None):
    self.log = log
    self.bin = bin
    self.pid = pid
    self.conf = conf
Run Code Online (Sandbox Code Playgroud)

虽然这仍然有些重复,但代码非常容易阅读.所有属性都是关于是否传入相应关键字参数的初始化,并且函数的签名清楚地记录了参数并且存在默认值.

  • 太好了!默认值可以更短:`for key in(...):setattr(self,key,kwargs.get(key))` (6认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)

这具有self.log在任何情况下分配的额外优势(AttributeError意味着您的代码被打破,仅此而已.始终确保始终分配所有内容.).没有多余的self.log = default_log线条.您可以省略默认值None.


And*_*ark 5

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

self.log = kwargs.get('log')
self.bin = kwargs.get('bin')
self.pid = kwargs.get('pid')
self.conf = kwargs.get('conf')
Run Code Online (Sandbox Code Playgroud)