2024-03-29 00:30:04 发布
网友
使用**kwargs编写函数时,语法会变得不像没有它时那么干净。例如
def func(x, y): print(x + y)
将成为
def func(**kwargs): print(kwargs["x"] + kwargs["y"])
有什么建议可以让夸尔格更漂亮更干净吗?你知道吗
另一个答案中提到的argparse经常使用kwargs。它在处理大量可选参数时提供了很大的灵活性,但语法并不简单。您需要处理用户不提供值的情况。字典get很适合:
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:
if 'x' in kwargs:
for key in kwargs:
对于关键字参数,可以使用相同的**dict输入样式:
**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:
*args
In [248]: def func(*args): ...: x, y = args ...: return x + y ...: In [249]: func(1,2) Out[249]: 3
argparse.Namespace的部分代码:
argparse.Namespace
class Namespace(_AttributeHolder): def __init__(self, **kwargs): for name in kwargs: setattr(self, name, kwargs[name])
这会将字典键转换为对象属性。argparse还注意到,您可以使用vars(args)转到另一个方向,从对象的属性获取字典。你知道吗
vars(args)
建议使用Namespacefrom 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
很适合:同时使用
if 'x' in kwargs:
或for key in kwargs:
对于关键字参数,可以使用相同的
**dict
输入样式:您可以用以下方法解压
kwargs
:但在这种情况下,您最好使用
*args
:argparse.Namespace
的部分代码:这会将字典键转换为对象属性。
argparse
还注意到,您可以使用vars(args)
转到另一个方向,从对象的属性获取字典。你知道吗建议使用
Namespace
fromargparse
(在标准库中提供)并使用普通属性访问:正在执行:
相关问题 更多 >
编程相关推荐