问题:如何检查** kwargs键是否存在?
Python 3.2.3。这里列出了一些想法,这些想法可以在常规var上使用,但是** kwargs似乎遵循不同的规则…所以,为什么这行不通?我如何检查** kwargs中的键是否存在?
if kwargs['errormessage']:
print("It exists")
我也认为这应该可行,但是不-
if errormessage in kwargs:
print("yeah it's here")
我猜是因为kwargs是可迭代的?我是否必须遍历它只是为了检查是否存在特定的密钥?
回答 0
你要
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
值或键不存在之间的区别时,这会很方便。
回答 1
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
)发生了变化,则无需更改代码。这种方法减少了开发时间,同时支持所有接口更改。
回答 2
就是这样:
if 'errormessage' in kwargs:
print("yeah it's here")
您需要检查密钥是否在字典中。这样做的语法是some_key in some_dict
(这里some_key
是可哈希的,不一定是字符串)。
您链接的想法(这些想法)包含用于检查locals()
and所返回的字典中是否存在特定键的示例globals()
。您的示例与此类似,因为您正在检查kwargs
字典(包含关键字参数的字典)中是否存在特定键。
回答 3
一种方法是自己添加!怎么样?通过合并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
包括我们期望的所有键。我们首先检查kwarg中是否有任何意外的键。然后我们更新args
用kwargs
,这将覆盖任何新的价值用户已设置。我们不需要测试键是否存在,我们现在将其args
用作参数字典,并且不再需要kwargs
。
回答 4
您可以自己轻松发现这些东西:
def hello(*args, **kwargs):
print kwargs
print type(kwargs)
print dir(kwargs)
hello(what="world")
回答 5
if kwarg.__len__() != 0:
print(kwarg)