为所有类方法打印python文档字符串
我想打印一个模块的文档,包括类中每个类和每个方法的docstring,但只包括我编写的方法;不是默认方法 这是我的模块.py:为所有类方法打印python文档字符串,python,python-3.x,documentation-generation,docstring,Python,Python 3.x,Documentation Generation,Docstring,我想打印一个模块的文档,包括类中每个类和每个方法的docstring,但只包括我编写的方法;不是默认方法 这是我的模块.py: import json import pandas as pd class my_class1: """My class 1 docs.""" def my_method1(self): """My class 1 method 1 docs.""" return None class my_class2:
import json
import pandas as pd
class my_class1:
"""My class 1 docs."""
def my_method1(self):
"""My class 1 method 1 docs."""
return None
class my_class2:
"""My class 1 docs."""
def my_method1(self):
"""My class 2 method 2 docs."""
return None
所需输出如下:
my_class1
My class 1 docs.
my_method1:
My class 1 method 1 docs.
my_class2
My class 2 docs.
my_method2:
My class 2 method 2 docs.
此脚本成功打印我想要的所有类方法:
import my_module as mm
imports = ['json','pd'] # Pre-defined modules within my_module that I don't wish to document
for i in [c for c in dir(mm) if not c.startswith('__') and not c in imports]:
print(getattr(mm, i).__name__)
print(getattr(mm, i).__doc__)
输出:
my_class1
My class 1 docs.
my_class2
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
但是我尝试了这个脚本来包含方法,但它只是多次记录每个类并排除这些方法
import my_module as mm
imports = ['json','pd']
for i in [c for c in dir(mm) if not c.startswith('__') and not c in imports]:
print(getattr(mm, i).__name__)
print(getattr(mm, i).__doc__)
for j in [c for c in dir(i) if c == '__init__' or not c.startswith('__')]:
print(getattr(mm, i,j).__name__)
print(getattr(mm, i,j).__doc__)
输出:
my_class1
My class 1 docs.
my_class2
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class1
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
my_class2
My class 1 docs.
我应该使用什么来打印所有方法docstring?这里有一个大量使用inspect模块的解决方案。请注意,这只有两层深。它不会捕获嵌套在其他类方法中的方法。我在许多附带的软件包上进行了测试,结果很好
导入检查
与def相关(obj):
“”“用于检查器筛选出非用户定义函数/类的筛选器”“”
如果hasattr(对象名称)和对象名称='type':
返回错误
如果inspect.isfunction(obj)或inspect.isclass(obj)或inspect.ismethod(obj):
返回真值
def打印文档(模块):
默认值='未提供文档字符串'#如果没有文档字符串,可以根据需要删除默认值
flag=True
对于inspect.getmembers中的子级(与模块相关):
如果没有标记:打印('\n\n\n')
flag=False#避免输出顶部的换行
doc=inspect.getdoc(子[1])
如果不是文件:
doc=默认值
打印(子[0],文档,sep='\n')
如果检查.isclass(子类[1]):
对于inspect.getmembers中的孙辈(子[1]是否相关):
doc=inspect.getdoc(孙子[1])
如果文件:
doc=doc.replace('\n','\n')
其他:
doc=默认值
打印('\n'+孙子[0],文档,sep='\n')
导入您的\u模块
打印\u文档(您的\u模块)
您不能像这样链接getattr
参数getattr(a,'b,'c')
并不意味着a.b.c
。啊,好的,谢谢。那么,我如何获得这些方法的属性呢?我看到的大多数方法都使用functools。为此减少。尽管如果使用不当,它会变得毛茸茸的,并导致奇怪的错误。你似乎在重新发明。