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