Functools.update_wrapper() 无法正常工作



我在装饰器中使用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中得到了改变,请参阅错误报告讨论。

相关内容

  • 没有找到相关文章

最新更新