【问题标题】:Printing python docstrings for all Class methods为所有 Class 方法打印 python 文档字符串
【发布时间】:2019-09-24 23:14:56
【问题描述】:

我想打印一个模块的文档以包含每个类和类中每个方法的文档字符串,但只包括我编写的方法;不是默认方法。

这是my_module.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.

但我已经尝试过这个脚本来包含方法,但它只是多次记录每个类并排除方法。

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_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.

我应该用什么来打印所有的方法文档字符串?

【问题讨论】:

  • 你不能像这样链接getattr 参数。 getattr(a, 'b', 'c') 不代表a.b.c
  • 嗯,好的,谢谢。那么如何获取方法的属性呢?
  • 大多数我看到使用functools.reduce。虽然如果使用不当,它会变得多毛并导致奇怪的错误。
  • 你似乎在重塑pydoc

标签: python python-3.x documentation-generation docstring


【解决方案1】:

这是一个大量使用检查模块的解决方案。请注意,这只有 2 层深。它不会捕获嵌套在其他类方法中的方法。我在很多包含的软件包上进行了测试,并取得了不错的效果。

import inspect


def is_relevant(obj):
    """Filter for the inspector to filter out non user defined functions/classes"""
    if hasattr(obj, '__name__') and obj.__name__ == 'type':
        return False
    if inspect.isfunction(obj) or inspect.isclass(obj) or inspect.ismethod(obj):
        return True


def print_docs(module):
    default = 'No doc string provided' # Default if there is no docstring, can be removed if you want
    flag = True

    for child in inspect.getmembers(module, is_relevant):
        if not flag: print('\n\n\n')
        flag = False # To avoid the newlines at top of output
        doc = inspect.getdoc(child[1])
        if not doc:
            doc = default
        print(child[0], doc, sep = '\n')

        if inspect.isclass(child[1]):
            for grandchild in inspect.getmembers(child[1], is_relevant):
                doc = inspect.getdoc(grandchild[1])
                if doc:
                    doc = doc.replace('\n', '\n    ')
                else:
                    doc = default 
                print('\n    ' + grandchild[0], doc, sep = '\n    ')


import your_module
print_docs(your_module)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多