[英]Python function: how to use the argument in kwargs
使用 **kwargs 编写函数时,语法变得不像没有它那么干净。 例如
def func(x, y):
print(x + y)
会变成
def func(**kwargs):
print(kwargs["x"] + kwargs["y"])
有什么建议可以使调用 kwargs 更好更干净吗?
一个建议是使用argparse
Namespace
(在标准库中可用)并使用正常的属性访问:
from argparse import Namespace
def somefunc(**kwargs):
kwargs = Namespace(**kwargs)
print(kwargs.foo)
print(kwargs.bar)
执行:
In [9]: somefunc(foo='hello', bar='world')
hello
world
另一个答案中提到的argparse
使用kwargs
。 它在处理大量可选参数时提供了很大的灵活性,但语法并不“简单”。 您需要处理用户不提供值的情况。 字典get
对此有好处:
In [241]: def func(**kwargs):
...: print(kwargs)
...: x = kwargs.get('x',0)
...: y = kwargs.get('y',0)
...: return x + y
...:
...:
In [242]: func(x=1, y=2)
{'x': 1, 'y': 2}
Out[242]: 3
In [243]: func(**{'x':1, 'y':2})
{'x': 1, 'y': 2}
Out[243]: 3
也使用if 'x' in kwargs:
或for key in kwargs:
使用关键字参数,您可以使用相同的**dict
输入样式:
In [244]: def func(x=0, y=2):
...: return x + y
In [245]: func(**{'x':1, 'y':2})
Out[245]: 3
您可以使用以下命令打开kwargs
:
In [246]: def func(**kwargs):
...: x, y = kwargs.values()
...: return x + y
...:
In [247]: func(**{'x':1, 'y':2})
Out[247]: 3
但在这种情况下,您不妨使用*args
:
In [248]: def func(*args):
...: x, y = args
...: return x + y
...:
In [249]: func(1,2)
Out[249]: 3
argparse.Namespace
部分代码:
class Namespace(_AttributeHolder):
def __init__(self, **kwargs):
for name in kwargs:
setattr(self, name, kwargs[name])
这会将字典键转换为对象属性。 argparse
还指出,您可以使用vars(args)
去另一个方向,从对象的属性中获取字典。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.