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


110

Python 3.2.3。这里列出了一些想法,这些想法可以在常规var上使用,但是** kwargs似乎遵循不同的规则...所以,为什么这行不通?我如何检查** kwargs中的键是否存在?

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

我也认为这应该可行,但是不-

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

我猜是因为kwargs是可迭代的?我是否必须遍历它只是为了检查是否存在特定的密钥?


4
没有特别规定。您只是忘记了引号。
Lennart Regebro 2012年

Answers:


163

你要

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值或键不存在之间的区别时,这会很方便。


感谢您的额外解释!对于python新手来说总是很有益的,以获得一些背景信息以及可能的事例和不可能的事例。本着这种精神:我认为,kwargs.get("errormessage", 17)可能会返回它的值,或者17如果不存在错误消息,那么我不确定。那是对的吗?
Honeybear '18 -4-5

嗯,是的。在这里找到它。谢谢...只是想确定一下。
Honeybear

21

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


感谢您展示如何为分配默认值prefix
HBat

11

就是这样:

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中是否有任何意外的键。然后我们更新argskwargs,这将覆盖任何新的价值用户已设置。我们不需要测试键是否存在,我们现在将其args用作参数字典,并且不再需要kwargs


1

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

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

hello(what="world")

13
删除“简单”,然后是一个更好的答案。如果每个人都很容易,那么我们就不需要此站点。in如果您从未编程过和/或不熟悉Python,那么查找操作符本身并不容易。仅在dict.get()dict.setdefault()帮助中得到提示。
cfi 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.