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)

>>>

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...