简化`if 'foo' in kwargs and kwargs['foo'] is True:`
Simplify `if 'foo' in kwargs and kwargs['foo'] is True:`
是否可以简化 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()
...
我想知道我是否可以使用更简单的方法来减少样板...
dict.get
有助于在访问不存在的密钥时避免 KeyError
:
if kwargs.get('foo'):
或
if kwargs.get('foo', False):
这个怎么样?
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
检查可能未设置的值的方法是使用 get()
,其中 returns None
缺少键而不是引发错误。但是您还应该更改 is True
部分:
如果您只检查值本身,则布尔测试结果为真;所以写
更简单(并且是 python 风格)
如果kwargs.get("foo"):
...
is True
不仅多余,而且不正确:is
不检查值是否相等,而是检查同一性。在 python 中,任何非零值都算作真,但是例如1 is True
结果是假的! 1 == True
检查 "truthiness",这是你应该使用的(如果有的话)。即使 this 函数只会接收 True 布尔值,用不必要的强假设来增加代码的负担并不是一个好主意。
是否可以简化 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()
...
我想知道我是否可以使用更简单的方法来减少样板...
dict.get
有助于在访问不存在的密钥时避免 KeyError
:
if kwargs.get('foo'):
或
if kwargs.get('foo', False):
这个怎么样?
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
检查可能未设置的值的方法是使用 get()
,其中 returns None
缺少键而不是引发错误。但是您还应该更改 is True
部分:
如果您只检查值本身,则布尔测试结果为真;所以写
更简单(并且是 python 风格)如果kwargs.get("foo"): ...
is True
不仅多余,而且不正确:is
不检查值是否相等,而是检查同一性。在 python 中,任何非零值都算作真,但是例如1 is True
结果是假的!1 == True
检查 "truthiness",这是你应该使用的(如果有的话)。即使 this 函数只会接收 True 布尔值,用不必要的强假设来增加代码的负担并不是一个好主意。