微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pythonic编写包装函数的方法

假设我有一个函数foo,它可以获得一些参数

def foo(width,height,depth=0):
    ...

我想编写一个包装器函数获取所有foo的参数并将它们传递给它,例如

def goo(width,depth=0):
    ...
    foo(width,depth)
    ...

但这很难看,因为我必须重复变量和认值.

在python中执行此操作的惯用方法是什么?

我想到的几个选项:

>传递给一个名为foo_params的字典并调用foo(** foo_params)然后因为我不知道而容易出错
如果所有的论点都在那里
>为foo编写另一个包装器,检查具有认值的参数是否为None,如果是,则不传递它们
>将认值作为常量,这样我就不再重复了

解决方法

您可以使用* args和** kwargs语法来传递未知数量的参数和/或关键字参数

>>> def dec(func):
    def inner(*args,**kwargs):
        print('decorated function')
        func(*args,**kwargs)
    return inner

>>> @dec
def func(a,b):
    return a + b

>>> func(1,2)
decorated function
>>>

使用* args和** kwargs一个缺点是你将失去装饰函数的原始函数签名.例如:

>>> help(func)
Help on function inner in module __main__:

inner(*args,**kwargs)

>>>

解决方案是使用functools.wraps().它基本上将装饰函数的数据复制到包装函数

>>> from functools import wraps
>>> 
>>> def dec(func):
    @wraps(func)
    def inner(*args,2)
decorated function
>>>

你可以在下面看到,如果你现在做帮助(func),将显示func的原始签名:

>>> help(func)
Help on function func in module __main__:

func(a,b)

>>>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐