-->

文档字符串设置为内部DEF的表达(Setting the docstring to an expre

2019-06-27 15:43发布

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

这可能吗?

(两方面的原因,我能想到这样做的:从一个模块导入功能(你要导入的文档字符串太),并使用词法分析器 。)

Answer 1:

你不能这样做,因为只有一个字符串文字识别为一个文档字符串。 但是你可以使用一个装饰来设置或修改函数的文档字符串。 (你也可以修改__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)


Answer 2:

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

您也可以明确地分配给文档字符串属性之后,如果你真的需要这个 。 我不明白为什么会需要它虽然。 你的理由似乎腥对我说:

  • 导入功能(或其他任何东西,真的),为您提供了相同的对象,用相同的文档字符串。 包装的功能则是另一回事,但对我们有什么functools.wraps
  • 分解出一个正则表达式的部分为一个独立的变量并没有做任何事情,更具有可读性本身。 手头上有记号的定义是理解的动作代码是至关重要的。


Answer 3:

否,则不能从该函数的主体内,而不是在不执行代码外线的功能,或在函数内部(这要求第一调用功能)设定的函数的文档字符串。

该方法通常蟒设置文档字符串采取功能套件(一切下缩进的第一线def线), 如果这是一个字符串文字 ,它会删除从套件,使该文档字符串。 然后Python编译套件到函数代码对象的其余部分,并创建新的function()通过使在所述编译的代码对象与文档字符串(等等)对象。

如果您使用的是恰好产生一个字符串代替,那么“绝招”不起作用的表达; 蟒将忽略表达,留下作为函数套件编译的一部分。 由于功能套件本身被编译和不执行 ,你不能“伸手”,并设置在编译时的函数对象上要使用的文档字符串。

您可以动态地设置的函数的文档字符串的唯一方法是通过直接引用的函数对象,设置它的__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).

有没有必要单独导入文档字符串。



Answer 4:

您可以修改__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


文章来源: Setting the docstring to an expression inside def