是否可以简化kwargs
选项的布尔检查?
例如在foo
中,我必须检查很多选项:
def foo(*args, **kwargs):
if 'foo' in kwargs and kwargs['foo'] is True:
do_something()
if 'bar' in kwargs and kwargs['bar'] is True:
do_something_else()
...
一种可能的工作方法是通过增加更多复杂性来隐藏一些复杂性......
def parse_kwargs(kwords, **kwargs):
keywords = {}
for kw in kwords:
keywords[kw] = True if kw in kwargs and kwargs['kw'] is True else False
return keywords
然后在我的主要功能中:
def foo(*args, **kwargs):
kw = parse_kwargs(**kwargs)
if kw['foo']:
do_something()
if kw['bar']:
do_something_else()
...
我想知道我是否可以使用更简单的方法来减少样板...
答案 0 :(得分:6)
答案 1 :(得分:1)
这个怎么样?
def foo(*args, **kwargs):
keywords = {'foo': do_foo_something,
'bar': do_bar_something,
'frug': do_frug_someting,
...}
for k in keywords:
if kwargs.get(k, False):
keywords[k]()
def do_foo_something():
do stuff
def do_bar_something():
do stuff
def do_frug_something():
do stuff
答案 2 :(得分:1)
检查可能未设置的值的方法是get()
,它会在丢失的密钥上返回None
而不是引发错误。但您也应该更改is True
部分:
如果您只检查值本身,则布尔测试结果为true;所以编写
更简单(和适当的python风格)如果kwargs.get(“foo”): ...
is True
不仅冗余,而且不正确:is
不检查值相等,而是检查身份。任何非零值在python中都计为true,但是例如1 is True
出现错误! 1 == True
检查“真实性”,是你应该使用的(如果有的话)。即使这个函数只会收到真正的布尔值,但是如果对代码的内容进行不必要的强烈假设,那么加载代码是一个坏主意。