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风格)

    如果kwargs.get(“foo”):

  • 为真
    不仅冗余,而且不正确:
    不检查值是否相等,而是检查标识。在python中,任何非零值都视为true,但例如
    1为true
    则显示为false
    1==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