Python中如何获取被装饰器修饰的函数的__doc__说明文档?
解决方案
你遇到的问题本质是装饰器将原函数替换为包装函数后,包装函数默认没有继承原函数的元信息(包括文档字符串__doc__),可以通过以下两种主流方案解决:
方案1:使用标准库functools.wraps(最推荐)
这是Python官方提供的标准方案,会自动将原函数的文档字符串、函数名、参数签名等所有元信息拷贝到包装函数上,修改后的装饰器示例如下:
import functools def decor_func(func): # 用wraps装饰包装函数,传入原函数func作为参数 @functools.wraps(func) def wrap(*args, **kwargs): return func(*args, **kwargs) return wrap @decor_func def foo(*args, **kwargs): """ Foo documentation is here! """ return None print(foo.__doc__) # 输出: # Foo documentation is here!
除了__doc__,该方案还会同步保留原函数的__name__、__module__、参数签名等信息,兼容性最好。
方案2:手动拷贝原函数元信息
如果不想引入额外依赖,也可以手动将需要的元信息赋值给包装函数,适合简单场景:
def decor_func(func): def wrap(*args, **kwargs): return func(*args, **kwargs) # 手动拷贝文档字符串与函数名 wrap.__doc__ = func.__doc__ wrap.__name__ = func.__name__ return wrap
该方案的缺点是需要手动指定所有需要保留的元信息,容易遗漏。
补充:无需修改装饰器的临时取数方案
如果装饰器是第三方提供无法修改,大部分规范实现的装饰器会在包装函数上保留__wrapped__属性指向原函数,你可以直接通过该属性访问原函数的文档:
# 仅当装饰器实现了__wrapped__属性时可用 print(foo.__wrapped__.__doc__)
内容的提问来源于stack exchange,提问作者aminrd
相关产品推荐
相关产品推荐

