Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在平面方法中编辑文档?_Python_Python 3.x - Fatal编程技术网

Python 在平面方法中编辑文档?

Python 在平面方法中编辑文档?,python,python-3.x,Python,Python 3.x,我正试图围绕我编写的api制作一个超薄cli包装器。似乎是在导入时设置了\uuuu doc\uuuuudunder属性 >>> def foo(): ... """ ... doc ... """ ... pass ... >>> foo.__doc__ '\n\tdoc\n\t' 我发现我可以在方法中更改\uuuuuuuuuuuuuuu >>> def foo(): ... foo.__doc__

我正试图围绕我编写的api制作一个超薄cli包装器。似乎是在导入时设置了
\uuuu doc\uuuuu
dunder属性

>>> def foo():
...     """
...     doc
...     """
...     pass
...
>>> foo.__doc__
'\n\tdoc\n\t'
我发现我可以在方法中更改
\uuuuuuuuuuuuuuu

>>> def foo():
...     foo.__doc__ = "new doc"
...
>>> foo.__doc__
>>> foo()
>>> foo.__doc__
'new doc'
但这需要运行该方法

我正在编写一个工具,它允许
file.py--help
打印文档。但是,由于这是一个很薄的包装,所以最好只编辑
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

API.py

cli.py

我得到下面的答案。。。运行
pyhton3.6 cli.py时

not what I want


Some long doc string
当我运行
python3.6cli.py时--help

Usage: cli.py [OPTIONS]

  not what I want

Options:
  --help  Show this message and exit.

有没有办法将导入方法中的文档字符串注入到click方法中?也许一个装饰解决在导入时,但我不知道如何可能做到这一点。谢谢。

如果您在函数上以装饰器的形式实现对doc的更改,它将在导入时运行

def change_doc(function):
        function.__doc__="my text"
        return function

如果您在函数上作为装饰器实现对doc的更改,它将在导入时运行

def change_doc(function):
        function.__doc__="my text"
        return function

因此,一般的想法是,您希望能够使用
API.FOO.bar
并为其创建一个命名的包装器。没问题,尽管这需要一点开箱思考。这里的关键思想是理解装饰器也可以用作正常函数,将一个函数转换为另一个函数:

def wrap_api(method):
    result = click.command(method)
    result.__doc__ = method.__doc__
    return method
现在我们可以创建包装器:

hello = wrap_api(API.FOO.bar)

因此,一般的想法是,您希望能够使用
API.FOO.bar
并为其创建一个命名的包装器。没问题,尽管这需要一点开箱思考。这里的关键思想是理解decorator也可以用作普通函数,将一个函数转换为另一个函数:

def wrap_api(method):
    result = click.command(method)
    result.__doc__ = method.__doc__
    return method
现在我们可以创建包装器:

hello = wrap_api(API.FOO.bar)

您可以从外部更改函数的
\uuuuu doc\uuuuu
属性,实际上是从有函数引用的任何地方更改属性。@klahm所以我需要在方法外部执行此操作。。。像@changeDoc(API.FOO.bar)decorator,它使用一个方法从中获取文档,并装饰一个方法来更改文档?您可以从外部更改函数的
\uuuuuuu doc\uuuu
属性,实际上是从您对函数有引用的任何地方进行更改。@KlausD hm,所以我需要在方法之外进行更改。。。比如@changeDoc(API.FOO.bar)decorator,它使用一个方法从中获取文档,并装饰一个方法来更改文档?对于decorator来说,有没有什么奇特的方法来知道函数调用什么并使用该文档,或者我需要显式地向decorator传递从中获取文档的方法?我编辑过,虽然我不在计算机前,所以可能不完美装饰师有没有什么新奇的方法来知道函数调用了什么并使用该文档,或者我需要显式地向装饰师传递从中获取文档的方法?我编辑了,虽然我不在计算机前,所以可能不完美