Capitolo 3. La potenza dell'introspezione

3.1. Immergersi

Questo capitolo tratta di uno dei punti di forza di Python: l'introspezione. Come sapete, ogni cosa in Python è un oggetto e l'introspezione è del codice che vede altri moduli e funzioni in memoria come se fossero oggetti, ottenendo informazioni su di loro e manipolandoli. Andando avanti, definiremo delle funzioni senza nome, chiameremo funzioni con gli argomenti nell'ordine sbagliato e referenzieremo funzioni il cui nome non ci sarà mai noto.

Qui abbiamo un programma Python completo e funzionante. Dovreste essere in grado di capire un bel po' di cose solamente guardando l'esempio. Le linee numerate illustrano concetti trattati nella sezione Conoscere Python. Non preoccupatevi se il resto del codice sembra intimidatorio; imparerete tutto nel corso di questo capitolo.

Esempio 3.1. apihelper.py

Se non lo avete ancora fatto, potete scaricare questo ed altri esempi usati in questo libro.


def help(object, spacing=10, collapse=1): 1 2 3
    """Print methods and docstrings.
    
    Takes module, class, list, dictionary, or string."""
    methodList = [method for method in dir(object) if callable(getattr(object, method))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                      (method.ljust(spacing),
                       processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":                4 5
    print help.__doc__
1 Questo modulo ha una funzione, help. Come descritto nella sua dichiarazione, prende in ingresso tre parametri: object, spacing e collapse. Gli ultimi due sono parametri opzionali, come vedremo brevemente.
2 La funzione help ha una docstring multiriga che succintamente descrive lo scopo della funzione. Notate che nessun valore di ritorno è menzionato; questa funzione sarà usata solamente per i suoi effetti, non per il suo valore.
3 Il codice interno alla funzione è indentato.
4 Il if __name__ (trucco) permette al programma di fare qualcosa di utile anche quando viene eseguito da solo, senza comunque interferire con il suo utilizzo come modulo per altri programmi. In questo caso, il programma semplicemente stampa la docstring della funzione help.
5 Nelle istruzioni if usate == per i confronti, le parentesi non sono richieste.

La funzione help è realizzata per essere utilizzata da voi, i programmatori, mentre lavorate nella IDE di Python. Prende ogni oggetto che abbia funzioni o metodi (come un modulo, che ha delle funzioni, o una lista, che ha dei metodi) e ne stampa le funzioni con le loro stringhe di documentazione.

Esempio 3.2. Esempio di utilizzo di apihelper.py

>>> from apihelper import help
>>> li = []
>>> help(li)
append     L.append(object) -- append object to end
count      L.count(value) -> integer -- return number of occurrences of value
extend     L.extend(list) -- extend list by appending list elements
index      L.index(value) -> integer -- return index of first occurrence of value
insert     L.insert(index, object) -- insert object before index
pop        L.pop([index]) -> item -- remove and return item at index (default last)
remove     L.remove(value) -- remove first occurrence of value
reverse    L.reverse() -- reverse *IN PLACE*
sort       L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1

Di norma l'output è formattato per essere facilmente leggibile. Le stringhe di documentazione multilinea sono compattate in una singola lunga riga, ma questa opzione può essere cambiata specificando 0 per l'argomento collapse. Se i nomi delle funzioni sono più lunghi di 10 caratteri, potete specificare un valore più grande per l'argomento spacing in modo da rendere l'output più semplice da leggere.

Esempio 3.3. Utilizzo avanzato di apihelper.py

>>> import odbchelper
>>> help(odbchelper)
buildConnectionString Build a connection string from a dictionary Returns string.
>>> help(odbchelper, 30)
buildConnectionString          Build a connection string from a dictionary Returns string.
>>> help(odbchelper, 30, 0)
buildConnectionString          Build a connection string from a dictionary

    Returns string.