pyclbr - Browser di Classe

Scopo: Implementa una API atta all'utilizzo in un editor di codice per creare un browser di classe.

pyclbr può scorrere un sorgente Python per trovare classi e funzioni a se stanti. Le informazioni su classi, metodi, nomi di funzioni e numeri di riga sono raccolte usando tokenize senza importare il codice.

Gli esempi in questa sezione utilizzano il file sorgente seguente come input.

# pyclbr_example.py
"""Sorgente di esempio per pyclbr
"""


class Base:
    """Questa è la classe base.
    """

    def method1(self):
        return


class Sub1(Base):
    """Questa è la prima sottoclasse.
    """


class Sub2(Base):
    """Questa è la seconda sottoclasse.
    """


class Mixin:
    """UNa classe mixin.
    """

    def method2(self):
        return


class MixinUser(Sub2, Mixin):
    """Sovrascrive i method1 e method2
    """

    def method1(self):
        return

    def method2(self):
        return

    def method3(self):
        return


def my_function():
    """Funzione a se stante.
    """
    return

Alla Ricerca delle Classi

Ci sono due funzioni pubbliche esposte da pyclbr. La prima, readmodule(), riceve il nome del modulo come argomento e ritorna una mappatura di nomi di classi e oggetti Class che contengono i metadati circa il sorgente della classe.

# pyclbr_readmodule.py

import pyclbr
import os
from operator import itemgetter


def show_class(name, class_data):
    print('Classe:', 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)

I metadati per la classe includono il file e il numero di riga dove è definito, assieme ai nomi delle classi super. I metodi della classe sono salvati in una mappatura tra nome metodo e numero di riga. Il risultato mostra le classi e i metodi elencati in ordine in base al loro numero di riga nel file sorgente.

$ pyclbr_readmodule.py

/dati/dev/python/pymotw3restyling/dumpscripts/_pyrunner.sh: line 3: pyclbr_readmodule.py: command not found

Alla Ricerca di Funzioni

L'altra funzione pubblica, readmodule_ex(), fa tutto quello che fa readmodule(), e aggiunge le funzioni all'insieme dei risultati.

# 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('Funzione: {0} [{1}]'.format(name, data.lineno))

Ciascun oggetto Function ha proprietà molto simili a quelle dell'oggetto Class.

$ pyclbr_readmodule_ex.py

/dati/dev/python/pymotw3restyling/dumpscripts/_pyrunner.sh: line 3: pyclbr_readmodule_ex.py: command not found

Vedere anche:

pyclbr
La documentazione della libreria standard per questo modulo.
inspect
Il modulo inspect può scoprire maggiori metadati circa classi e funzioni, ma richiede l'importazione del codice.
tokenize
Il modulo tokenize scinde il codice sorgente Python in token.