141

蟒蛇 3.2.3。这里列出了一些想法,它们适用于常规 var,但似乎 **kwargs 遵循不同的规则......那么为什么这不起作用以及如何检查 **kwargs 中的键是否存在?

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

我也认为这应该可行,但它没有——

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

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

4

6 回答 6

216

你要

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”关联的值,然后检查其布尔值”。所以如果没有这样的密钥,你会得到一个KeyError.

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

我应该提到字典还有一个.get()接受默认参数的方法(本身默认为None),因此kwargs.get("errormessage")如果该键存在则返回值,None否则返回值(类似于kwargs.get("errormessage", 17)您可能认为的那样)。当您不关心键存在与None作为值或键不存在之间的区别时,这可能会很方便。

于 2012-09-13T05:17:45.353 回答
28

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)发生变化,你不需要改变你的代码。这种方法减少了开发时间,同时支持所有接口更改。

于 2012-09-13T09:35:11.097 回答
15

就是这样:

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

您需要检查密钥是否在字典中。其语法是some_key in some_dict(其中some_key的东西是可散列的,不一定是字符串)。

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

于 2012-09-13T05:19:51.143 回答
6

一种方法是自己添加!如何?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 中是否有任何意外的键。然后我们更新which 将覆盖用户设置的任何新值argskwargs我们不需要测试一个键是否存在,我们现在使用args作为我们的参数字典并且不再需要kwargs.

于 2012-09-13T07:57:33.870 回答
2

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

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

hello(what="world")
于 2012-09-13T07:24:24.393 回答
2
if kwarg.__len__() != 0:
    print(kwarg)
于 2019-08-16T04:45:05.547 回答