【问题标题】:python: Printing a function name with __name__ prints the decorator instead of the function name [duplicate]python:使用__name__打印函数名会打印装饰器而不是函数名[重复]
【发布时间】:2021-05-31 17:12:23
【问题描述】:

我有以下代码:

def test(testFunc):
    def runTest(*args, **kwargs):
        testFunc(*args, **kwargs)
    return runTest


@test
def func1():
    pass

@test
def func2():
    pass

tests = [func1, func2]

def RunTest():
   testList = [x.__name__ for x in tests ]
   print(testList)

运行上面的代码会打印出[runTest, runTest],这是装饰器的名称。知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

  • 必须提供minimal reproducible examplecleanup 是什么?无论如何,您为什么期望它打印原始函数的名称?你知道你的装饰器返回另一个函数runTest吗?
  • @juanpa 更令人惊讶的是它说“测试”然后......
  • 修复了我的问题中的一些错误。谢谢指出

标签: python


【解决方案1】:

这也是functools.wraps存在的原因之一

通过将@wraps(testFunc) 添加到您的runTest 函数,原始函数的名称将被保留。它本质上是这样的:

runTest.__name__ = testFunc.__name__

返回之前runTest

这在您的示例中不会发生,因为香草装饰器很简单:

func1 = test(func1)

wraps 还从包装函数复制任何文档字符串)

只需将@wraps 添加到您的内部函数中

def test(testFunc):
    @wraps(testFunc)
    def runTest(*args, **kwargs):
        testFunc(*args, **kwargs)
    return runTest

你应该得到:

['func1', 'func2']

【讨论】:

  • 如果这是问题所在,输出应该是“runTest”...
  • 我认为这是由于我删除了 cleanup 装饰器。
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2011-09-05
相关资源
最近更新 更多