简化`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 部分:

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

    更简单(并且是 python 风格)

    如果kwargs.get("foo"): ...

  2. is True 不仅多余,而且不正确:is 不检查值是否相等,而是检查同一性。在 python 中,任何非零值都算作真,但是例如1 is True 结果是假的! 1 == True 检查 "truthiness",这是你应该使用的(如果有的话)。即使 this 函数只会接收 True 布尔值,用不必要的强假设来增加代码的负担并不是一个好主意。