如何在函数装饰器包装后获取函数的原始名称?

时间:2016-08-18 21:57:23

标签: python

代码

def blahblah(func):
    def wrapper(*args):
        pass # blah blah blah....
    return wrapper

@blahblah
def func1(arg1):
    pass # blah blah blah

@blahblah
def func2(arg1):
    pass # blah blah blah

functions = [func1, func2]

for func in functions:
    print(func.__name__, func(0))

我想要的是获取此代码的原始名称,例如" func1"和" func2"。但是之前编写的代码只给了我" wrapper"和"包装"。有什么办法吗?在不更改包装代码的情况下更好。

输出

  wrapper None
  wrapper None

理想输出

  func1 None
  func2 None

1 个答案:

答案 0 :(得分:5)

您可以使用functools.wraps帮助函数,如下所示,它将保留包装函数的原始名称和文档字符串,例如:

from functools import wraps

def blahblah(func):
    @wraps(func)
    def wrapper(*args):
        pass # blah blah blah....
    return wrapper

@blahblah
def func1(arg1):
    pass # blah blah blah

print(func1.__name__)
# func1

正如kojiro在评论中指出的那样,虽然这会保留名称和文档字符串,但有些事情需要注意 - https://hynek.me/articles/decorators/