Python 简化'if';foo';在kwargs和kwargs中,';foo';]是真的:`
是否可以简化Python 简化'if';foo';在kwargs和kwargs中,';foo';]是真的:`,python,keyword-argument,Python,Keyword Argument,是否可以简化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 p
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()
...
我想知道我是否可以使用一个更简单的方法—更少的样板文件…有助于避免在访问不存在的密钥时出现KeyError
:
if kwargs.get('foo'):
或
这个怎么样
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()
,它在缺少键时返回None
,而不是引发错误。但您还应更改是否为True
部分:
为真
不仅冗余,而且不正确:为
不检查值是否相等,而是检查标识。在python中,任何非零值都视为true,但例如1为true
则显示为false1==True
检查“真实性”,这是您应该使用的(如果有的话)。即使这个函数只接收真正的布尔值,用不必要的关于它将看到什么的强大假设来填充代码也是一个坏主意if-kwargs.get('foo'):
Great,这正是我想要的:).get()
返回的默认值是None
,因此kwargs.get('foo',False)
在这种情况下确实不需要。但是请大家帮个忙,只要写if-kwargs.get('foo'):
hmm。。。简化代码的有用技术。干得好这是对这个问题的一个很好的回答,但我实际上是在试图避免发现它时出现的KeyError
。明白了。在看到shx2的答案后,我采纳了他的get()建议。我以为你在寻找某种方法来管理所有的“做事”。如果你明确地在寻找True
if-kwargs.get('foo')
与if-kwargs.get('foo')为True不同。说它是错误的就像说如果某个值是无的,那么在这种情况下,是真的
确实是合适的。在这种情况下,你认为发生这种情况的可能性有多大?重新编辑你的评论:我称之为不正确,正是因为它不一样。这都是关于上下文,只有OP知道可能的值。我同意,只有OP知道。但是None
的情况不一样:None
是“falsy”,但也是一个缺少的值,因此对照它检查会显示出一个特定的意图。如果有人测试为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