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

Python 3.2.3。 有一些想法在这里列出 ,这对普通var的工作,但似乎** kwargs发挥不同的规则…所以为什么不工作,我怎样才能检查是否存在一个关键** kwargs?

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

我也认为这应该工作,但它不 –

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

我猜是因为kwargs是可迭代的? 我是否必须遍历它才能检查一个特定的密钥是否在那里?

你要

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

这样, kwargs就是另一个dict 。 你的第一个例子, if kwargs['errormessage'] ,意思是“在kwargs中获得与关键字”errormessage“关联的值,然后检查它的bool值”。 所以,如果没有这样的密钥,你会得到一个KeyError

你的第二个例子, if errormessage in kwargs:意味着“如果kwargs包含由” errormessage “命名的元素,并且除非” errormessage “是一个variables的名字,你会得到一个NameError

我应该提到字典也有一个.get()方法,它接受一个默认参数(默认为None ),这样kwargs.get("errormessage")返回值,如果该键存在的话,则返回None (类似于kwargs.get("errormessage", 17)做你可能会认为它)。 当你不关心现有的密钥和None作为一个值的密钥或不存在的密钥之间的差别时,这可以是方便的。

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 ,那么默认的'' (空string)被存储在本地prefixvariables中。 如果给出,那么它的价值正在被使用。

这通常是为任何types的函数编写包装的紧凑和可读的配方:总是只传递你不明白的参数,甚至不知道它们是否存在。 如果你总是通过*args**kwargs使你的代码变慢,并且需要更多的input,但是如果被调用的函数的接口(在这种情况下是print )发生了变化,你不需要改变你的代码。 这种方法减less了开发时间,同时支持所有界面变更

这只是:

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

你需要检查,如果密钥在字典中。 some_key in some_dict的语法是some_key in some_dict (其中some_key in some_dict是可some_key in some_dict ,不一定是string)。

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

一种方法是自己添加它! 怎么样? 通过合并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 ,它会覆盖用户设置的任何新值。 我们不需要testing一个键是否存在,我们现在使用args作为参数字典,并且不再需要kwargs

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

 def hello(*args, **kwargs): print kwargs print type(kwargs) print dir(kwargs) hello(what="world")