我在装饰器中使用Functools.update_wrapper()
,但update_wrapper
似乎只重写函数属性(如__doc__
、__name__
),但不影响help()
函数。
我知道这些答案,但它们不适用于decorator类。
这是我的功能。
import functools
class memoized(object):
def __init__(self, func):
self.func = func
functools.update_wrapper(self, func)
def __call__(self, *args):
self.func(*args)
@memoized
def printer(arg):
"This is my function"
print arg
这是输出
>>> printer.__doc__
This is my function
>>> help(printer)
Help on memoized in module __main__ object:
printer = class memoized(__builtin__.object)
| Methods defined here:
|
| __call__(self, *args)
|
| __init__(self, func)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
它看起来像一个bug,但我该如何修复它?
functools.update_wrapper()
在实例上设置属性,但在3.8之前的Python版本中,help()
会查看类型的信息。
因此,printer.__doc__
为您提供了实例属性,help()
打印关于type(printer)
的信息,例如memoized
类,它没有__doc__
属性。
这不被认为是一个错误,这都是设计出来的;当您传入实例时,help()
将始终查看类。如果您希望help()
为修饰的函数工作,或者升级您的Python版本,请不要使用类作为装饰器。
这一点最终在Python 3.9中得到了改变,请参阅错误报告讨论。