如何检查是否存在** 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)被存储在本地prefix
variables中。 如果给出,那么它的价值正在被使用。
这通常是为任何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")