包装函数的函数名?

时间:2015-06-12 09:28:23

标签: python

如何获取原始功能的名称?

def wrap(f):
    def wrapped_f(*args, **kwargs):
        # do something
    return wrapped_f

@wrap
def A(params):
   # do something

print(A.__name__)

结果:wrapped_f,但我需要A!

2 个答案:

答案 0 :(得分:6)

使用functools.wraps()

直接来自文档:

  

如果不使用这个装饰工厂,示例函数的名称就是'包装',原始example()的docstring就会丢失。

示例:

from functools import wraps


def wrap(f):
    @wraps(f)
    def wrapped_f(*args, **kwargs):
        pass
    return wrapped_f


@wrap
def A(params):
    pass


print(A.__name__)

<强>输出:

$ python -i foo.py
A
>>> 

答案 1 :(得分:5)

使用functools.wraps或手动更新wrapped_f的__name__属性。

from functools import wraps

def wrap(f):
    @wraps(f)
    def wrapped_f(*args, **kwargs):
        # do something
    return wrapped_f

@wrap
def A(params):
   # do something

print(A.__name__)