如何检查 * * kwargs 中的密钥是否存在?

Python 3.2.3.有一些想法 列在这里,它工作在普通的 var 的,但它似乎 * * kwargs 发挥不同的规则... 那么为什么这个不工作,我怎么才能检查,如果在 * * kwargs 存在一个关键?

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

我也觉得这样应该可以,但是不行

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

我猜是因为 kwargs 是可迭代的?我是否必须遍历它,只是为了检查是否存在特定的键?

153345 次浏览

你想要的

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

第二个示例 if errormessage in kwargs:表示“如果 kwargs包含由“ errormessage”命名的元素,并且除非“ errormessage”是变量的名称,否则将得到一个 NameError

我应该提到的是,字典还有一个方法 .get(),它接受一个默认参数(它本身默认为 None) ,这样,如果键存在,kwargs.get("errormessage")返回值,否则 None返回(类似地,kwargs.get("errormessage", 17)做你可能认为它做的事情)。当您不关心键值存在与使用 None作为值或键不存在之间的差异时,这可能很方便。

事情是这样的:

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

你需要检查一下,这把钥匙是否在字典里。它的语法是 some_key in some_dict(其中 some_key是散列的,不一定是字符串)。

您链接的想法(这些想法)包含了检查 locals()globals()返回的字典中是否存在特定关键字的例子。您的示例与此类似,因为您正在检查 kwargs字典(包含关键字参数的字典)中是否存在特定的键。

你可以自己很容易地发现这些事情:

def hello(*args, **kwargs):
print kwargs
print type(kwargs)
print dir(kwargs)


hello(what="world")

一种方法是自己加!怎么做到的?通过将 kwargs与大量默认值合并。这并不适用于所有场合,例如,如果你事先不知道钥匙。然而,如果他们是,这里有一个简单的例子:

import sys


def myfunc(**kwargs):
args = {'country':'England','town':'London',
'currency':'Pound', 'language':'English'}


diff = set(kwargs.keys()) - set(args.keys())
if diff:
print("Invalid args:",tuple(diff),file=sys.stderr)
return


args.update(kwargs)
print(args)

默认值在字典 args中设置,其中包括我们期望的所有键。我们首先检查 kwargs 中是否有任何意外的键。然后我们用 kwargs更新 args,它将覆盖用户设置的任何新值。我们不需要测试键是否存在,我们现在使用 args作为参数字典,不再需要 kwargs

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

如您所见,如果 prefix不包含在 kwargs中,那么默认的 ''(空字符串)存储在本地 prefix变量中。如果给定了它,则正在使用它的值。

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

if kwarg.__len__() != 0:
print(kwarg)