如何检查 **kwargs 中的键是不是存在?

Posted

技术标签:

【中文标题】如何检查 **kwargs 中的键是不是存在?【英文标题】:How To Check If A Key in **kwargs Exists?如何检查 **kwargs 中的键是否存在? 【发布时间】:2012-09-06 03:50:03 【问题描述】:

Python 3.2.3。有一些想法listed here,适用于常规 var,但似乎 **kwargs 遵循不同的规则......那么为什么这不起作用,我如何检查 **kwargs 中的键是否存在?

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

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

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

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

【问题讨论】:

没有特殊规定。你只是忘记了引号。 【参考方案1】:

你想要

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(类似@987654338 @ 做了你可能认为它会做的事情)。当您不关心键存在与将 None 作为值或键不存在之间的区别时,这会很方便。

【讨论】:

感谢您的额外解释!对于 python 新手来说,获得一些背景信息和更多关于什么是可能的和什么是不可能的例子总是好的。本着这种精神:我认为,kwargs.get("errormessage", 17) 可能会返回其值,如果错误消息不存在,17 可能会返回 - 但我不确定。对吗? 啊是的。找到它here。谢谢...只是想确定一下。【参考方案2】:

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

如您所见,如果kwargs 中不包含prefix,则默认''(空字符串)将存储在本地prefix 变量中。如果给出,那么它的值正在被使用。

这通常是为任何类型的函数编写包装器的紧凑且可读的秘诀:始终只是传递您不理解的参数,甚至不知道它们是否存在。如果你总是通过*args**kwargs 你会让你的代码变慢,并且需要更多的输入,但是如果被调用函数的接口(在这种情况下是print)发生变化,你不需要改变你的代码。这种方法减少了开发时间,同时支持所有接口更改。

【讨论】:

感谢您展示如何为 prefix 分配默认值。 我真的很喜欢包装函数时的传递行为——它使这种技术在面对未来对包装函数的更新时特别健壮。【参考方案3】:

就是这样:

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

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

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

【讨论】:

澄清一下:if some_key in kwargs: 不是更像if some_key in some_dict.keys(): 吗?换句话说,kwargs 是不是更像一个解压的字典? 哦等等!你有一个相关的答案,它澄清了很多事情:***.com/questions/10491027/…【参考方案4】:

一种方法是自己添加!如何?通过将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,这将覆盖用户设置的任何新值。我们不需要测试一个键是否存在,我们现在使用args作为我们的参数字典,不再需要kwargs

【讨论】:

【参考方案5】:

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

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

hello(what="world")

【讨论】:

去掉“easy”,这样就更好了。如果这对每个人来说都很容易,那么我们就不需要这个网站了。如果您从未编程过和/或不熟悉 Python,那么找到 in 运算符本身并不容易。仅在 dict.get()dict.setdefault() 帮助中有所暗示。 简单互动!谢谢! =D【参考方案6】:
if kwarg.__len__() != 0:
    print(kwarg)

【讨论】:

以上是关于如何检查 **kwargs 中的键是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查哈希中是不是存在特定值?

如何检查哈希中是不是存在特定键?

JavaScript:检查对象数组中是不是存在重复的键值并删除所有但最近添加的具有该键值的对象

如何在 Json.Net 中的 JsonConvert DeserializeObject 之后获取所有不存在的键?

检查一个键是不是存在并且它的值不是 Python 字典中的空字符串

检查Javascript中对象数组中的键是不是?