【问题标题】:Simplify `if 'foo' in kwargs and kwargs['foo'] is True:`简化 `if 'foo' in kwargs and kwargs['foo'] is True:`
【发布时间】:2016-03-11 08:56:33
【问题描述】:

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

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

【问题讨论】:

标签: python keyword-argument


【解决方案1】:

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

if kwargs.get('foo'):

或者

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

【讨论】:

  • 太好了,这正是我想要的:)
  • .get()返回的默认值是None,所以kwargs.get('foo', False)在这种情况下确实不需要。
  • 但是帮大家一个忙,写if kwargs.get('foo'):
【解决方案2】:

这个怎么样?

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

【讨论】:

  • 嗯...简化代码的有用技术。干得好! :D
  • 这是对这个问题的一个很好的答案,但实际上我试图避免KeyError,因为shx2 找到了它。
  • 明白了。看到他的回答后,我采纳了 shx2 的 get() 建议。我以为你想通过某种方式来管理所有“做某事”。
【解决方案3】:

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

  1. 如果您只检查值本身,则布尔测试结果为真;所以写起来更简单(和正确的python风格)

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

  2. is True 不仅是多余的,而且是不正确的:is 不检查值是否相等,而是检查身份。任何非零值在 python 中都算作真,但例如1 is True 是假的! 1 == True 检查“真实性”,并且是您应该使用的(如果有的话)。即使 函数只会接收 True 布尔值,但在代码中对它会看到的内容进行不必要的强假设也是一个坏主意。

【讨论】:

  • 如果您明确地寻找True 怎么办? if kwargs.get('foo')if kwargs.get('foo') is True 不同。说错就等于说if some_val is None错了
  • 在这种情况下,is True 确实合适。您认为在这种情况下发生这种情况的几率是多少?
  • 重新编辑您的评论:我称之为不正确,正是因为它不一样。
  • 一切都与上下文有关,只有 OP 知道哪些值是可能的
  • 我同意,只有 OP 知道。但是None 的情况不一样:None 是“假的”,但也是一个缺失值,因此检查它会发现一个特定的意图。如果有人在使用is False 进行测试,那么我也会发出同样的警告。是的,这是可以想象的,但不太可能是真正的意图。
猜你喜欢
  • 2017-04-07
  • 2011-04-16
  • 2019-12-29
  • 2023-04-01
  • 2022-01-09
  • 1970-01-01
  • 2014-03-20
  • 2022-08-14
  • 2013-11-01
相关资源
最近更新 更多