You are here: Partenza > Dive Into Python > Programmazione orientata ai dati > Mettere assieme il tutto (parte 1) | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Ora abbiamo imparato abbastanza da poter scomporre le prime sette linee dell'esempio di questo capitolo: leggere una directory ed importare alcuni dei moduli che vi sono contenuti.
def regressionTest(): path = os.path.abspath(os.path.dirname(sys.argv[0])) files = os.listdir(path) test = re.compile("test\.py$", re.IGNORECASE) files = filter(test.search, files) filenameToModuleName = lambda f: os.path.splitext(f)[0] moduleNames = map(filenameToModuleName, files) modules = map(__import__, moduleNames)
Osserviamolo linea per linea, interattivamente. Assumendo che la directory corrente sia c:\diveintopython\py, che contiene gli esempi di questo libro, compreso lo script di questo capitolo. Come abbiamo visto in Trovare il percorso, la directory degli script sarà contenuta nella variabile path, per cui ne assegnamo il valore e procediamo.
>>> import sys, os, re, unittest >>> path = r'c:\diveintopython\py' >>> files = os.listdir(path) >>> files ['BaseHTMLProcessor.py', 'LICENSE.txt', 'apihelper.py', 'apihelpertest.py', 'argecho.py', 'autosize.py', 'builddialectexamples.py', 'dialect.py', 'fileinfo.py', 'fullpath.py', 'kgptest.py', 'makerealworddoc.py', 'odbchelper.py', 'odbchelpertest.py', 'parsephone.py', 'piglatin.py', 'plural.py', 'pyfontify.py', 'regression.py', 'roman.py', 'romantest.py', 'uncurly.py', 'unicode2koi8r.py', 'urllister.py', 'kgp', 'roman', 'colorize.py']
>>> test = re.compile("test\.py$", re.IGNORECASE) >>> files = filter(test.search, files) >>> files ['apihelpertest.py', 'kgptest.py', 'odbchelpertest.py', 'romantest.py']
>>> filenameToModuleName = lambda f: os.path.splitext(f)[0] >>> filenameToModuleName('romantest.py') 'romantest' >>> filenameToModuleName('odchelpertest.py') 'odbchelpertest' >>> moduleNames = map(filenameToModuleName, files) >>> moduleNames ['apihelpertest', 'kgptest', 'odbchelpertest', 'romantest']
Come si è visto in Usare le funzioni lambda, lambda è un modo veloce, anche se poco elegante, per creare delle semplici funzioni su una sola riga. Questa accetta come argomento un nome di file con estensione e restituisce solo il nome vero e proprio, grazie all'uso della funzione standard di libreria os.path.splitext vista nell'Esempio 4.36, “Dividere i pathnames”. | |
filenameToModuleName è una funzione. Non c'è niente di magico nelle funzioni lambda rispetto alle normali funzioni definite con l'istruzione def. filenameToModuleName può essere chiamata come ogni altra funzione e fa esattamente ciò che si desiderava: rimuove l'estensione dal suo argomento. | |
Ora la funzione può essere applicata ad ogni file della lista dei file di test delle unità, utilizzando map. | |
Il risultato è proprio quello cercato: una lista di moduli, sotto forma di stringhe. |
>>> modules = map(__import__, moduleNames) >>> modules [<module 'apihelpertest' from 'apihelpertest.py'>, <module 'kgptest' from 'kgptest.py'>, <module 'odbchelpertest' from 'odbchelpertest.py'>, <module 'romantest' from 'romantest.py'>] >>> modules[-1] <module 'romantest' from 'romantest.py'>
Come si è visto in Importare dinamicamente i moduli, si possono utilizzare map ed __import__ insieme per trasformare una lista di nomi di moduli (sotto forma di stringhe) in veri moduli (ai quali si può accedere come ad ogni altro modulo). | |
modules è una lista di moduli, alla quale si può accedere come ad ogni altro modulo. | |
L'ultimo modulo nella lista è il modulo romantest, proprio come se si fosse utilizzato import romantest. Come si vedrà nella sezione successiva, non solo si può accedere a questo modulo, istanziare le classi contenute in esso e chiamarne le funzioni, si può fare introspezione nel modulo per scoprire quali classi e funzioni contiene. |
<< Importare dinamicamente i moduli |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Dentro PyUnit >> |