如何检查** kwargs中的密钥是否存在?

时间:2012-09-13 05:15:00

标签: python dictionary python-3.x kwargs

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是可迭代的?我是否必须遍历它以检查特定键是否存在?

6 个答案:

答案 0 :(得分:122)

你想要

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 1}}否则(类似kwargs.get("errormessage", 17)做你可能认为它做的事情)。当您不关心现有密钥与None作为值或密钥不存在之间的区别时,这可能很方便。

答案 1 :(得分:18)

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

答案 2 :(得分:8)

就是这样:

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

如果密钥在字典中,您需要检查。它的语法是some_key in some_dict(其中some_key是可以删除的东西,不一定是字符串)。

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

答案 3 :(得分:2)

一种方法是自己添加!怎么样?通过将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中是否有任何意外的键。然后我们使用args更新kwargs,这将覆盖用户设置的所有新值。我们不需要测试密钥是否存在,我们现在使用args作为我们的参数字典,不再需要kwargs

答案 4 :(得分:1)

您可以自己轻松发现这些事情:

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

hello(what="world")

答案 5 :(得分:0)

df1<-structure(list(Date = structure(3634, class = "Date"), Date1 = structure(3633, class = "Date"), 
    Date2 = structure(3632, class = "Date"), Date3 = structure(3631, class = "Date"), 
    Date4 = structure(3630, class = "Date"), Date5 = structure(3629, class = "Date"), 
    Date6 = structure(3628, class = "Date")), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))

df2<-structure(list(yr = c(1979, 1979), day = c(351, 347), Date = structure(c(3637, 
3633), class = "Date")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))

df1$y_n<-if_else(df2$Date %in% df1$Date |
                 df2$Date %in% df1$Date1 |
                  df2$Date %in% df1$Date3 |
                   df2$Date %in% df1$Date4 |
                   df2$Date %in% df1$Date5 |
                   df2$Date %in% df1$Date6,"yes","no")