简化`if'foo'在kwargs和kwargs ['foo']是真的:`

时间:2015-12-06 20:00:49

标签: python kwargs

是否可以简化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()
   ...

我想知道我是否可以使用更简单的方法来减少样板...

3 个答案:

答案 0 :(得分:6)

在访问不存在的密钥时,

dict.get有助于避免KeyError

if kwargs.get('foo'):

if kwargs.get('foo', False):

答案 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部分:

  1. 如果您只检查值本身,则布尔测试结果为true;所以编写

    更简单(和适当的python风格)

    如果kwargs.get(“foo”):     ...

  2. is True不仅冗余,而且不正确:is不检查值相等,而是检查身份。任何非零值在python中都计为true,但是例如1 is True出现错误! 1 == True检查“真实性”,是你应该使用的(如果有的话)。即使这个函数只会收到真正的布尔值,但是如果对代码的内容进行不必要的强烈假设,那么加载代码是一个坏主意。