Автор оригинала: 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 на токены.