以下代码存在一个小问题:
docs = {}
def register(func):
docs[func] = func.__doc__
return func
@register
def blue():
"""Color function."""
pass
@register
def red():
pass
red.__doc__ = blue.__doc__
print("docstring real:", red.__doc__)
print("docstring registered:", docs[red]) # None!
red
函数从blue
函数获取其文档字符串。但在装饰者注册之后会发生。
我可以为register
装饰器添加一个可选参数,但这种情况不够特别。看起来我必须复制并粘贴字符串。没问题......除了我还在想是否有一个我忽略的微不足道的修复。
更新:在意识到@decorator
只是语法糖之后我找到了解决方法:
# @register
def red():
pass
red.__doc__ = blue.__doc__
red = register(red)
这解决了我的问题。
在函数定义之后仍然创建docstring。有关原始问题的答案,请参阅idjaw添加的评论。