Автор оригинала: 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]
Смотрите также
- стандартная библиотечная документация для pyclbr
- inspect – модуль
inspect
может обнаруживать дополнительные метаданные о классах и функциях, но требует импорта кода. tokenize
– модульtokenize
анализирует исходный код Python на токены.