4

我想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

这可能吗?

(我可以考虑这样做的两个原因:从模块导入函数(并且您也想导入文档字符串)和使用lexer。)

4

4 回答 4

5

你不能这样做,因为只有字符串文字被识别为文档字符串。但是您可以使用装饰器来设置或修改函数的文档字符串。(您也可以__doc__在可执行代码中显式修改,但装饰器更简洁,因为它在逻辑上是声明的一部分)。

这可能很有用,例如,如果您有几个函数应该包含与其文档字符串(部分)相同的文本。这是一个小装饰器,它将其参数(文字或变量)附加到函数声明的文档字符串中。

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)
于 2012-08-31T15:46:47.673 回答
1

你不能。规则是:将字符串文字作为第一个语句作为文档字符串。如果它是一个表达式,则它不是字符串文字,因此被忽略。

如果你真的需要这个,你也可以在之后显式地分配给 docstring 属性。我不明白你为什么需要它。你的理由对我来说似乎很可疑:

  • 导入一个函数(或其他任何东西,真的)给你相同的对象,具有相同的文档字符串。包装一个函数是另一回事,但对于我们所拥有的functools.wraps.
  • 将正则表达式的一部分分解为一个单独的变量并不会使任何内容本身更具可读性。掌握令牌定义对于理解操作代码至关重要。
于 2012-08-31T15:44:17.547 回答
1

不,您不能从函数体内设置函数的文档字符串,除非在函数外部或函数内部(需要先调用函数)执行代码,否则无法设置。

python 通常设置文档字符串的方式是获取函数套件的第一行(在该def行下缩进的所有内容),如果那是字符串文字,它将从套件中删除并使其成为文档字符串。然后 Python 将套件的其余部分编译成函数代码对象,并function()通过传入编译的代码对象和文档字符串(以及其他)来创建一个新对象。

如果您使用恰好产生字符串的表达式,那么该“技巧”不起作用;python 将忽略该表达式,将其作为函数套件的一部分进行编译。因为函数套件本身是编译的而不是执行的,所以您不能“伸出”并设置要在编译期间在函数对象上使用的文档字符串。

动态设置函数文档字符串的唯一方法是直接引用函数对象并设置它的__doc__func_doc变量(两者都是别名)。当然,这可以在函数套件中完成,但这毫无意义,除非你这样做,否则文档字符串将是错误的。

请注意,当您从模块中导入函数时,您也已经获得了文档字符串:

>>> import itertools
>>> print itertools.groupby.__doc__
groupby(iterable[, keyfunc]) -> create an iterator which returns
(key, sub-iterator) grouped by each value of key(value).

无需单独导入文档字符串。

于 2012-08-31T15:45:41.470 回答
0

您可以__doc__在运行时修改函数的属性:

>>> def what():
...    """docstring"""
...    what.__doc__ += " x"
...    print what.__doc__
... 
>>> what()
docstring x
>>> what()
docstring x x
>>> what()
docstring x x x
>>> what()
docstring x x x x
于 2012-08-31T17:09:18.490 回答