加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Pythonic编写包装函数的方法

发布时间:2020-12-20 12:01:44 所属栏目:Python 来源:网络整理
导读:假设我有一个函数foo,它可以获得一些参数 def foo(width,height,depth=0): ... 我想编写一个包装器函数来获取所有foo的参数并将它们传递给它,例如 def goo(width,depth=0): ... foo(width,depth) ... 但这很难看,因为我必须重复变量和默认值. 在python中执行
假设我有一个函数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)

>>>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读