Python 函数:如何在 kwargs 中使用参数
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)
的另一个方向,从对象的属性中获取字典。
使用**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)
的另一个方向,从对象的属性中获取字典。