我想在func_doc
中设置def
(作为表达式)。
def f():
'''My function help''' #Set the docstring
def g():
"My function " + "help" # An expression, so not read as a docstring
# can I put something here to set the docstring as an expression?
g.func_doc # is None
g.func_doc = "My function " + "help" # This works
这可能吗?
(我可以考虑这样做的两个原因:从模块导入一个函数(您也希望导入docstring)和使用lexer)
最佳答案
不能这样做,因为只有字符串文本被识别为docstring。但是可以使用decorator设置或修改函数的docstring。(您也可以在可执行代码中显式地修改__doc__
,但是decorator要干净得多,因为它在逻辑上是声明的一部分)。
例如,如果有多个函数应包含与其docstring(部分)相同的文本,则这可能很有用。这里有一个小装饰器,它将参数(文字或变量)附加到函数声明的docstring中。
def docstring(docstr, sep="\n"):
"""
Decorator: Append to a function's docstring.
"""
def _decorator(func):
if func.__doc__ == None:
func.__doc__ = docstr
else:
func.__doc__ = sep.join([func.__doc__, docstr])
return func
return _decorator
可以这样使用:
@docstring("copyright by nobody")
def testme():
"This function does nothing"
pass
或者您可以直接执行它,以修改现有函数(可能是从另一个模块导入的):
from re import sub
docstring("Copyright unknown")(sub)