Python kwargs解析最佳实践

Python kwargs解析最佳实践,python,keyword-argument,Python,Keyword Argument,有没有更紧凑/高效的方法 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':

有没有更紧凑/高效的方法

    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]

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

self.log = kwargs.get('log')
self.bin = kwargs.get('bin')
self.pid = kwargs.get('pid')
self.conf = kwargs.get('conf')
for k,v in kwarg.iteritems():
   setattr(self, k, v)

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

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

然而,我通常更喜欢这样的东西:

def f(log=None, bin=None, pid=None, conf=None):
    self.log = log
    self.bin = bin
    self.pid = pid
    self.conf = conf
kwargs_list = [
    "log",
    "bin",
    "pin",
    "conf"
]

for key in kwargs_list:
    setattr(self, key, kwargs.get(key, None))
虽然这仍然有些重复,但代码确实很容易阅读。所有属性都是初始化的,以确定是否传入了相应的关键字参数,并且函数的签名清楚地记录了参数和默认值。

self.\uu dict\uuuu.update(kwargs)

这还有一个额外的优点,就是在任何情况下都会分配
self.log
AttributeError
意味着您的代码被破坏得像地狱一样糟糕,仅此而已。始终确保始终分配所有内容。)。没有额外的
self.log=默认的\u log
行。您可以忽略默认值以获取
None

self.log = kwargs.get('log')
self.bin = kwargs.get('bin')
self.pid = kwargs.get('pid')
self.conf = kwargs.get('conf')
for k,v in kwarg.iteritems():
   setattr(self, k, v)
其中
setattr(self,“bin”,“val”)
类似于调用
self.bin=“val”


然而,更理想的是有一个像@Sven Marnach那样的白名单。

我的解决方案是:

for key in ('log', 'bin', 'pid', 'conf'):
    setattr(self, key, kwargs.get(key, None))
在此模式下,所有属性都将初始化

当我有大量属性时,我更喜欢创建一个列表,这样更易于阅读:

def f(log=None, bin=None, pid=None, conf=None):
    self.log = log
    self.bin = bin
    self.pid = pid
    self.conf = conf
kwargs_list = [
    "log",
    "bin",
    "pin",
    "conf"
]

for key in kwargs_list:
    setattr(self, key, kwargs.get(key, None))

这可能是非常危险的,而且无论哪种方式都是令人讨厌的。很好!如果使用默认值:
输入(…):setattr(self,key,kwargs.get(key))
@pajton:当然可以,但是我尽量靠近OP的代码。@pajton为什么在你的建议中删除了
输入kwargs:
行?为什么不检查
是否输入kwargs
?如果可以为这些参数设置默认值,则不需要该选项
kwargs.get(key)
将返回
None
如果密钥不存在,则在将kwargs转发到内部呼叫时还会返回kwargs.pop(key[,默认值])。如果未找到键且未给出默认值,则此项会引发键错误,因此kwargs.pop(键,无)使senseI发现此项在
setattr
上有用,而我必须访问
kwargs
类ex之外的)模块级别