为所有类方法打印python文档字符串

为所有类方法打印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:

我想打印一个模块的文档,包括类中每个类和每个方法的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:
    """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。为此减少
。尽管如果使用不当,它会变得毛茸茸的,并导致奇怪的错误。你似乎在重新发明。