繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM