关于python:如何检查**kwargs中的值是否存在?

How To Check If A Key in **kwargs Exists?

Python 3.2.3.这里列出了一些对常规VaR有效的想法,但似乎**Kwarg根据不同的规则发挥作用…那么,为什么这不起作用,我如何检查**Kwargs中的键是否存在?

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

我也认为这应该管用,但不行--

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

我猜是因为Kwargs是无可辩驳的?为了检查是否有一个特定的键,我是否需要迭代它?


你想要

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

得到EDOCX1的值〔0〕。

1
2
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作为值或密钥不存在之间的区别时,这很方便。


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

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

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

然后:

1
2
3
4
>>> my_print('eggs')
 eggs
>>> my_print('eggs', prefix='spam')
spam eggs

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

这通常是为任何类型的函数编写包装器的一个简洁易读的方法:总是传递您不理解的参数,甚至不知道它们是否存在。如果您总是通过*args**kwargs,您会使代码变慢,需要更多的输入,但是如果被调用函数的接口(在本例中是print)发生更改,则不需要更改代码。这种方法在支持所有接口更改的同时减少了开发时间。


就是这样:

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

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

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


一种方法是自己添加它!怎样?通过将kwargs与一系列违约合并。这并不适用于所有场合,例如,如果您事先不知道钥匙。但是,如果是,下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
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


你可以自己轻松地发现这些东西:

1
2
3
4
5
6
def hello(*args, **kwargs):
    print kwargs
    print type(kwargs)
    print dir(kwargs)

hello(what="world")