我有几个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!'这样的列表。
答案 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+' ')