2012-09-13 71 views
55

Python 3.2.3。有一些想法listed here,这在普通VAR的工作,但它似乎** kwargs不同的游戏规则...那么,为什么不这项工作,我该怎么检查,看看是否在** kwargs一个键是否存在?如何检查** kwargs中是否存在密钥?

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

我也觉得这应该工作,但它不会 -

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

我猜是因为kwargs是迭代?我是否必须遍历它才能检查一个特定的密钥是否在那里?

+2

没有特别的规定。你只是忘了引号。 –

回答

86

你想

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之间的差异作为值或密钥不是e xisting,这可以很方便。

8

这仅仅是这样的:

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

你需要检查,如果关键是在字典中。其语法是some_key in some_dict(其中some_key是可散列的东西,不一定是字符串)。

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

1

你可以自己很容易地发现那些东西:

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

hello(what="world") 
+3

删除“简单”,然后这是一个更好的答案。如果每个人都很容易,那么我们就不需要这个网站。如果你从来没有编程和/或对Python不熟悉,那么发现'in'运算符本身并不容易。它只能在'dict.get()'和'dict.setdefault()'帮助中暗示。 – cfi

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

11

帝斯曼和塔德克的答案直接回答你的问题。

在我的脚本中,我经常使用方便的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 

正如你可以看到,如果prefixkwargs遏制,那么默认''(空字符串)被存储在当地的prefix变量。如果给出,那么它的价值正在被使用。

这通常是一个紧凑且可读的配方,用于为任何类型的函数编写包装:总是只是您不明白的传递参数,甚至不知道它们是否存在。如果您始终通过*args**kwargs,则会使代码变慢,并且需要多输入一次,但如果调用函数的接口(在此例中为print)发生更改,则无需更改代码。这种方法减少了开发时间,同时支持所有接口更改

相关问题