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