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) 的另一个方向,从对象的属性中获取字典。