You are here: Partenza > Dive Into Python > La potenza dell'introspezione > Unire il tutto | << >> | ||||
Dive Into PythonPython per programmatori esperti |
L'ultima riga di codice, l'unica che ancora non abbiamo analizzato, è quella che svolge l'intero lavoro. Ma adesso il lavoro è semplice, perché ogni cosa di cui abbiamo bisogno è già impostata come serve a noi. Tutte le tessere sono al loro posto; è ora di buttarle giù.
print "\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList])
Notate che questo è un solo comando, suddiviso su più righe e non usa il carattere di continuazione (“\”). Ricordate quando dicevo che alcune espressioni possono essere suddivise in più righe senza usare un backslash? La list comprehension è una di queste, in quanto l'intera espressione è contenuta tra parentesi quadre.
Adesso cominciamo dalla fine e lavoriamo all'indietro. Il
for method in methodList
ci mostra che questa è una list comprehension. Come sappiamo, methodList è una lista di tutti i metodi di object ai quali siamo interessati. Quindi stiamo eseguendo un ciclo lungo questa lista con un certo metodo.
>>> import odbchelper >>> object = odbchelper >>> method = 'buildConnectionString' >>> getattr(object, method) <function buildConnectionString at 010D6D74> >>> print getattr(object, method).__doc__ Build a connection string from a dictionary of parameters. Returns string.
Nella funzione help, object è l'oggetto dal quale stiamo ottenendo l'aiuto, passato come argomento. | |
Siccome stiamo eseguendo un ciclo attraverso methodList, method è il nome del metodo corrente. | |
Usando la funzione getattr, stiamo ottenendo un riferimento alla funzione method nel modulo object. | |
Adesso stampare l'attuale docstring del metodo è semplice. |
Il prossimo pezzo del puzzle è l'utilizzo di str sulla stringa di documentazione. Come forse ricorderete, str è una funzione built-in che forza i dati in una stringa. Ma una stringa di documentazione è sempre una stringa dunque perché preoccuparsi di usare la funzione str? La risposta è che non tutte le funzioni hanno una stringa di documentazione e se non ce l'hanno, il loro attributo __doc__ vale None.
>>> >>> def foo(): print 2 >>> >>> foo() 2 >>> >>> foo.__doc__ >>> foo.__doc__ == None 1 >>> str(foo.__doc__) 'None'
In SQL, dovete usare IS NULL invece di = NULL per confrontare un valore nullo. In Python, potete usare indifferentemente == None o is None, ma is None è più efficiente. |
Adesso che ci siamo garantiti di avere una stringa, possiamo passare la stringa a processFunc, che abbiamo già definito come una funzione che comprime o meno gli spazi. Ora vedrete perché è stato importante usare str per convertire un valore None in una rappresentazione in stringa. processFunc assume di ricevere un argomento di tipo stringa e chiamare il suo metodo split, che restituirebbe un errore se passassimo None, perché None non ha un metodo split.
Facendo un ulteriore passo indietro, possiamo notare che stiamo usando nuovamente la formattazione delle stringhe per concatenare il valore di ritorno di processFunc con il valore di ritorno del metodo ljust. Questo è un nuovo metodo delle stringhe che non abbiamo visto prima.
>>> s = 'buildConnectionString' >>> s.ljust(30) 'buildConnectionString ' >>> s.ljust(20) 'buildConnectionString'
Abbiamo quasi finito. Dato il nome incolonnato dal metodo ljust e la (possibilmente priva di spazi bianchi) docstring della chiamata a processFunc, concateniamo i due ed otteniamo una singola stringa. Siccome stiamo mappando methodList, arriveremo ad ottenere una lista di stringhe. Usando il metodo join sulla stringa "\n", concateniamo questa lista in una singola stringa, con ogni elemento della lista su una riga a se stante e stampiamo il risultato.
Questo è l'ultimo pezzo del puzzle. Ora il codice dovrebbe essere chiaro.
<< Usare le funzioni lambda |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
Sommario >> |