pyclbr — Navegador de clases

Propósito:Implementa una interfaz de programación adecuada para su uso en un editor de código fuente para crear un navegador de clase.

pyclbr puede escanear el código fuente Python para encontrar clases y funciones independientes. La información sobre los nombres de clase, métodos y funciones y los números de línea se recopilan usando tokenize sin importar el código.

Los ejemplos en esta sección usan el siguiente archivo fuente como entrada.

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

Escaneo de clases

Hay dos funciones públicas expuestas por pyclbr. La primera, readmodule(), toma el nombre del módulo como argumento devuelve un mapa de nombres de clase a objetos de Class que contienen los metadatos sobre el origen de la clase.

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)

Los metadatos para la clase incluyen el archivo y el número de línea donde se define, así como los nombres de las superclases. Los métodos de la clase se guardan como un mapa entre el nombre del método y el número de línea. El resultado muestra las clases y métodos enumerados en orden según su número de línea en el archivo fuente.

$ 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]

Escaneo de funciones

La otra función pública en pyclbr es readmodule_ex(). Hace todo lo que readmodule() hace y agrega funciones al conjunto de resultados.

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))

Cada objeto Function tiene propiedades muy parecidas al objeto Clase.

$ python3 pyclbr_readmodule_ex.py

Function: my_function [51]

Ver también