简化 `if 'foo' in kwargs and kwargs['foo'] is True:` 的写法。

5

您好,以下是关于如何简化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()
   ...

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


1
if kwargs.get('foo'): - khelwood
1
https://dev59.com/J2ct5IYBdhLWcg3wCJJ- - Padraic Cunningham
3个回答

7

dict.get 可以避免在访问不存在的键时出现 KeyError 错误:

if kwargs.get('foo'):

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

1
太好了,这正是我想要的 :) - nowox
2
.get() 返回的默认值是 None,所以在这种情况下 kwargs.get('foo', False) 真的不是必需的。 - Burhan Khalid
1
但是请帮助大家,只需编写 if kwargs.get('foo'): - alexis

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

嗯... 简化代码的有用技巧。干得好! :D - Zizouz212
这是对这个问题的一个很好的回答,但我实际上是在尝试避免KeyError,就像shx2发现的那样。 - nowox
明白了。在看到shx2的get()建议后,我将其纳入了我的答案。我以为你是在寻找一种管理所有“做某事”的方法。 - Tom Barron

1
使用 get() 可以检查可能未设置的值,如果键不存在则返回 None 而不是引发错误。但是您还应该更改 is True 部分:
  1. 布尔测试在只检查值本身时为 true;因此,编写以下代码更简单(也符合 Python 的风格):

    if kwargs.get("foo"): ...

  2. is True 不仅多余,而且是错误的: is 不检查值相等性,而是检查标识。 在 Python 中,任何非零值都被视为 true,但例如 1 is True 会返回 false! 1 == True 检查 "truthiness",这才是你应该使用的(如果需要)。 即使函数只接收 True 布尔值,也不应该对它将看到什么做出不必要的强烈假设。


如果你明确地寻找 True,那该怎么办?if kwargs.get('foo')if kwargs.get('foo') is True 不是同一个意思。说前者是错误的就像说 if some_val is None 是错误的一样。 - Padraic Cunningham
在这种情况下,“is True”确实是合适的。你认为这种情况的可能性有多大? - alexis
关于您评论的编辑:我之所以称其为不正确,正是因为它并不相同。 - alexis
我同意,只有 OP 知道。但 None 的情况不同:None 是“falsy”,但也是一个缺失的值,因此检查它会显示出特定的意图。如果有人正在使用 is False 进行测试,那么我会发出同样的警告。是的,这是可以想象但不太可能真正打算的。 - alexis
我的意思是有时候你确实想要检查某些东西是否为“True”,在不知道它被如何使用的情况下,我们不能说它是错误的。 - Padraic Cunningham
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接