17.13. pyclbr — 类浏览器

未匹配的标注

目的:实现适用于源代码编辑器的 API ,用于创建类浏览器。

pyclbr 可以扫描 Python 源代码以查找类和独立函数。 使用 tokenize 收集有关类、方法和函数名称以及行号的信息,而不用导入代码。

本节中的示例使用以下源文件作为输入。

pyclbr_example.py

"""Example source for pyclbr.
"""

class Base:
    """This is the base class.
    """

    def method1(self):
        return

class Sub1(Base):
    """This is the first subclass.
    """

class Sub2(Base):
    """This is the second subclass.
    """

class Mixin:
    """A mixin class.
    """

    def method2(self):
        return

class MixinUser(Sub2, Mixin):
    """Overrides method1 and method2
    """

    def method1(self):
        return

    def method2(self):
        return

    def method3(self):
        return

def my_function():
    """Stand-alone function.
    """
    return

扫描类

pyclbr 暴露了两个公开函数。 第一个是 readmodule() ,它接受模块的名称,因为参数返回类名到包含类源元数据的 Class 对象的映射。

pyclbr_readmodule.py

import pyclbr
import os
from operator import itemgetter

def show_class(name, class_data):
    print('Class:', name)
    filename = os.path.basename(class_data.file)
    print('  File: {0} [{1}]'.format(
        filename, class_data.lineno))
    show_super_classes(name, class_data)
    show_methods(name, class_data)
    print()

def show_methods(class_name, class_data):
    for name, lineno in sorted(class_data.methods.items(),
                               key=itemgetter(1)):
        print('  Method: {0} [{1}]'.format(name, lineno))

def show_super_classes(name, class_data):
    super_class_names = []
    for super_class in class_data.super:
        if super_class == 'object':
            continue
        if isinstance(super_class, str):
            super_class_names.append(super_class)
        else:
            super_class_names.append(super_class.name)
    if super_class_names:
        print('  Super classes:', super_class_names)

example_data = pyclbr.readmodule('pyclbr_example')

for name, class_data in sorted(example_data.items(),
                               key=lambda x: x[1].lineno):
    show_class(name, class_data)

该类的元数据包括定义它的文件和行号,以及超类的名称。 类的方法储存为方法名称和行号之间的映射。 输出显示了根据源文件中的行号按顺序列出的类和方法。

$ python3 pyclbr_readmodule.py

Class: Base
  File: pyclbr_example.py [11]
  Method: method1 [15]

Class: Sub1
  File: pyclbr_example.py [19]
  Super classes: ['Base']

Class: Sub2
  File: pyclbr_example.py [24]
  Super classes: ['Base']

Class: Mixin
  File: pyclbr_example.py [29]
  Method: method2 [33]

Class: MixinUser
  File: pyclbr_example.py [37]
  Super classes: ['Sub2', 'Mixin']
  Method: method1 [41]
  Method: method2 [44]
  Method: method3 [47]

函数扫描

pyclbr 中的另一个公开函数是 readmodule_ex() 。 它执行 readmodule() 所做的一切,并将函数添加到结果集中。

pyclbr_readmodule_ex.py

import pyclbr
import os
from operator import itemgetter

example_data = pyclbr.readmodule_ex('pyclbr_example')

for name, data in sorted(example_data.items(),
                         key=lambda x: x[1].lineno):
    if isinstance(data, pyclbr.Function):
        print('Function: {0} [{1}]'.format(name, data.lineno))

每个 Function 对象都具有与 Class 对象非常相似的属性。

$ python3 pyclbr_readmodule_ex.py

Function: my_function [51]

另请参阅

  • pyclbr 标准库文档
  • inspect -- inspect 模块可以发现有关类和函数的更多元数据,但需要导入代码。
  • tokenize -- tokenize 模块将 Python 源代码解析为令牌。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/pymotw/pyclbr-c...

译文地址:https://learnku.com/docs/pymotw/pyclbr-c...

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~