从Python包__init__基于导入获取文档字符串

时间:2012-07-25 14:23:26

标签: python

我有几个Python包中的模块:

# my_package contents
__init__.py
module1.py
module2.py

在我的__init__.py中,我正在导入这些模块,以便在我的用户导入包后可以访问这些模块。

# __init__.py
import module1
import module2

我的问题是:我如何以编程方式访问每个模块中每个定义函数的文档字符串?我见过others使用了这种形式:

getattr(module, key). __doc__

但我无法让它为我工作。有什么想法吗?

编辑:更多背景......我们试图从我们的python包中提取内容(其中一个重要的东西是文档字符串),目的是将其用作文档的内容。我的老板已经设置了一些我们正试图加入的东西。

理想情况下,我希望获得package.module.function docstring结果

EDIT2:这是目前工作的内容:

#my package is named 'tpp'
import tpp

for script in dir(tpp):
    if not "__" in script: #not a builtin...
        docstrings1 = getattr( tpp, script).__doc__
        docstrings2 = " ".join(docstrings1.split())#clean out any newline chars
        print script, docstrings

EDIT3:了解文档字符串的位置以及我们如何组织内容:

import inspect
import tpp

inspect.getdoc(tpp)
#returns None

inspect.getdoc(tpp.module1)
#returns None

inspect.getdoc(tpp.module1.function1)
#'DOCSTRING TEXT FOUND!'

**最终,我希望得到一个像['module1','function1','DOCSTRING TEXT FOUND!'这样的列表。

2 个答案:

答案 0 :(得分:1)

使用inspect.getdoc(object)获取对象的文档字符串。 使用inspect.isfunction检查对象是否为函数。

import inspect
for variable in vars(module).values():
    if inspect.isfunction(variable):
        print(inspect.getdoc(variable))

请注意,如果对象没有docstring,则inspect.getdoc返回None,因此如果该函数没有docstring,代码将打印None。

答案 1 :(得分:1)

也许你想要这样的东西:

for script in dir(tpp):
    if not "__" in script: #not a builtin...
        docstrings1 = getattr( tpp, script).__doc__
        if docstrings1:  #objects without docstrings return None above, which can't be split.
            docstrings2 = " ".join(docstrings1.split())#clean out any newline chars
            print script, docstrings2

但我不保证这会获得所有文档字符串。您可能需要递归进入使用getattr检索的项目。

这是一个递归版本(可能会比你想要的更多)并且会阻塞循环依赖:

def get_all_doc(obj,indent=''):
    for item in filter(lambda x:not x.startswith('__'),dir(obj)):
        o=getattr(obj,item)
        print "{indent}{item} {doc}".format(indent=indent,
                                            item=item,
                                            doc=o.__doc__)
        get_all_doc(o,indent=indent+'   ')