Python函数:如何在kwargs中使用参数

2024-03-29 00:30:04 发布

您现在位置:Python中文网/ 问答频道 /正文

使用**kwargs编写函数时,语法会变得不像没有它时那么干净。例如

def func(x, y):
    print(x + y)

将成为

def func(**kwargs):
    print(kwargs["x"] + kwargs["y"])

有什么建议可以让夸尔格更漂亮更干净吗?你知道吗


Tags: 函数def语法建议kwargsfuncprint
2条回答

另一个答案中提到的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)转到另一个方向,从对象的属性获取字典。你知道吗

建议使用Namespacefrom argparse(在标准库中提供)并使用普通属性访问:

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

相关问题 更多 >