Рубрики
Без рубрики

pyclbr – Браузер классов

Автор оригинала: Doug Hellmann.

Цель:

Реализует 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(),
                               keyitemgetter(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(),
                               keylambda 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(),
                         keylambda 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]

Смотрите также