关于python:在kwargs和kwargs [‘foo’]中简化`if’foo’是真的:`

Simplify `if 'foo' in kwargs and kwargs['foo'] is True:`

是否可以简化kwargs选项的布尔检查?

例如,在foo中,我必须检查许多选项:

1
2
3
4
5
6
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()
   ...

一个可能的解决方法是通过增加复杂性来隐藏一些复杂性…

1
2
3
4
5
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

然后在我的主要功能中:

1
2
3
4
5
6
7
8
def foo(*args, **kwargs):
   kw = parse_kwargs(**kwargs)

   if kw['foo']:
      do_something()
   if kw['bar']:
      do_something_else()
   ...

我想知道我是否可以使用一个更简单的方法,更少的样板文件…


当访问不存在的密钥时,dict.get有助于避免KeyError

1
if kwargs.get('foo'):

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


检查可能未设置的值的方法是使用get(),它返回缺少键的None,而不是引发错误。但您还应更改is True部分:

  • 如果只检查值本身,布尔测试就变成了真的;因此编写起来更简单(而且是正确的python样式)。

    如果Kwargs.get("foo"):…

  • is True不仅是多余的,而且是错误的:is不检查值的相等性,而是检查身份。在python中,任何非零值都计为真,但例如,1 is True则显示为假!1 == True检查"真实性",这是您应该使用的(如果有的话)。即使这个函数只会收到真正的布尔值,用不必要的强假设来负担您的代码也是一个坏主意。


  • 这个怎么样?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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