如何检查 \*\*kwargs 中的键是否存在?

新手上路,请多包涵

蟒蛇 3.2.3。这里 列出了 一些想法,它们适用于常规 var,但 **kwargs 似乎按照不同的规则发挥作用……那么为什么这不起作用,我如何检查**kwargs 中的键是否存在?

 if kwargs['errormessage']:
    print("It exists")

我也认为这应该行得通,但行不通——

 if errormessage in kwargs:
    print("yeah it's here")

我猜是因为 kwargs 是可迭代的?我是否必须遍历它以检查是否存在特定密钥?

原文由 Zamphatta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
2 个回答

你要

if 'errormessage' in kwargs:
    print("found it")

获取 errormessage 的值

if 'errormessage' in kwargs:
    print("errormessage equals " + kwargs.get("errormessage"))

这样, kwargs 只是另一个 dict 。您的第一个示例 if kwargs['errormessage'] 表示“获取与 kwargs 中的键“errormessage”关联的值,然后检查其 bool 值”。因此,如果没有这样的密钥,您将得到一个 KeyError

Your second example, if errormessage in kwargs: , means “if kwargs contains the element named by ” errormessage “, and unless ” errormessage “ is the一个变量的名称,你会得到一个 NameError

我应该提到字典也有一个方法 .get() 它接受一个默认参数(本身默认为 None ),所以 kwargs.get("errormessage")None 否则(类似 kwargs.get("errormessage", 17) 做你可能认为它做的)。当您不关心键存在和将 None 作为值或键不存在之间的区别时,这会很方便。

原文由 DSM 发布,翻译遵循 CC BY-SA 3.0 许可协议

DSM 和 Tadeck 的回答直接回答了您的问题。

在我的脚本中,我经常使用方便的 dict.pop() 来处理可选的和附加的参数。这是一个简单的 print() 包装器的示例:

 def my_print(*args, **kwargs):
    prefix = kwargs.pop('prefix', '')
    print(prefix, *args, **kwargs)

然后:

 >>> my_print('eggs')
 eggs
>>> my_print('eggs', prefix='spam')
spam eggs

As you can see, if prefix is not contained in kwargs , then the default '' (empty string) is being stored in the local prefix 变量。如果给出,则使用它的值。

这通常是为任何类型的函数编写包装器的紧凑且可读的方法:始终只传递您不理解的参数,甚至不知道它们是否存在。如果你总是通过 *args**kwargs 你让你的代码变慢,并且需要更多的输入,但是如果被调用函数的接口(在这种情况下 print ) 变化,你不需要改变你的代码。这种方法减少了开发时间,同时支持所有接口更改。

原文由 cfi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题