Zam*_*tta 91 python dictionary kwargs python-3.x
Python 3.2.3.这里列出了一些有关常规变量的想法,但似乎**kwargs按照不同的规则进行播放...所以为什么这不起作用?如何查看**kwargs中的密钥是否存在?
if kwargs['errormessage']:
print("It exists")
Run Code Online (Sandbox Code Playgroud)
我也认为这应该有效,但事实并非如此 -
if errormessage in kwargs:
print("yeah it's here")
Run Code Online (Sandbox Code Playgroud)
我猜是因为kwargs是可迭代的?我是否必须遍历它才能检查特定键是否存在?
DSM*_*DSM 136
你要
if 'errormessage' in kwargs:
print("found it")
Run Code Online (Sandbox Code Playgroud)
获得价值 errormessage
if 'errormessage' in kwargs:
print("errormessage equals " + kwargs.get("errormessage"))
Run Code Online (Sandbox Code Playgroud)
这样,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作为值的密钥或不存在的密钥之间的区别,这可能很方便.
cfi*_*cfi 19
帝斯曼和塔德克的答案直接回答了你的问题.
在我的脚本中,我经常使用方便的方法dict.pop()来处理可选的和附加的参数.这是一个简单print()包装器的示例:
def my_print(*args, **kwargs):
prefix = kwargs.pop('prefix', '')
print(prefix, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
然后:
>>> my_print('eggs')
eggs
>>> my_print('eggs', prefix='spam')
spam eggs
Run Code Online (Sandbox Code Playgroud)
如您所见,如果prefix未包含kwargs,则默认''(空字符串)将存储在局部prefix变量中.如果给出,则使用其值.
这通常是一个紧凑且可读的配方,用于为任何类型的函数编写包装器:始终只是传递您不理解的参数,甚至不知道它们是否存在.如果你总是通过*args并且**kwargs你的代码变慢,并且需要更多的输入,但是如果被调用函数的接口(在这种情况下print)发生了变化,则不需要更改代码.这种方法缩短了开发时间,同时支持所有接口更改
Tad*_*eck 10
就是这样:
if 'errormessage' in kwargs:
print("yeah it's here")
Run Code Online (Sandbox Code Playgroud)
如果密钥在字典中,您需要检查.它的语法是some_key in some_dict(some_key可以清除的东西,不一定是字符串).
您链接的想法(这些想法)包含用于检查由locals()和返回的词典中是否存在特定键的示例globals().您的示例类似,因为您正在检查kwargs字典中的特定键的存在(包含关键字参数的字典).
一种方法是自己添加!如何?通过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)
Run Code Online (Sandbox Code Playgroud)
默认值在字典中设置args,其中包括我们期望的所有键。我们首先检查 kwargs 中是否有任何意外的键。然后我们更新args用kwargs,这将覆盖任何新的价值用户已设置。我们不需要测试键是否存在,我们现在args用作我们的参数字典并且不再需要kwargs.
| 归档时间: |
|
| 查看次数: |
72787 次 |
| 最近记录: |