包装函数的函数名? [复制]

Posted

技术标签:

【中文标题】包装函数的函数名? [复制]【英文标题】:Function name of wrapped function? [duplicate] 【发布时间】:2015-08-28 06:21:18 【问题描述】:

如何获取原始函数的名称?

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!

【问题讨论】:

【参考方案1】:

使用functools.wraps():

直接来自文档:

如果不使用这个装饰器工厂,示例函数的名称将会是 'wrapper',并且原始 example() 的文档字符串将会丢失。

示例:

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
>>> 

【讨论】:

【参考方案2】:

使用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__)

【讨论】:

以上是关于包装函数的函数名? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python开发第十四篇装饰器

将返回对象赋值给函数定义后的函数名的目的

python 动态获取当前运行的类名和函数名的方法

包装函数

函数 装饰器函数

C 字符处理函数