|
Abbiamo visto l'importazione di un singolo file. Questo presume che quando si esegue "import fact", esista un file chiamato "fact.py" nel PYTHONPATH. Tuttavia in generale non è comodo avere tutti i moduli accessibili nella stessa directory. Per esempio un modulo chiamato "util", può essere un nome comune utilizzabile in contesti diversi: potremo avere delle "util" per la posta elettronica, come pure delle "util" per la gestione dei database.
È possibile per fortuna suddividere i moduli in sottodirectory, che devono trovarsi in una directory del PYTHONPATH. I moduli che si trovano dentro una sottodirectory sono accessibili utilizzando un nome gerarchico, che utilizza i punti al posto delle barre. Una sottodirectory che contiene moduli viene definita "package". Per esempio:
>>> import email.Utils
>>> email.Utils
<module 'email.Utils' from 'C:\Python22\lib\email\Utils.py'>
Comunque, esiste una restrizione sulle directory che possono essere comprese nel path di ricerca: si richiede che ci sia nella directory un file "__init__.py". Questo serve per distinguere le directory che sono effettivamente dei contenitori di moduli , da quelle che invece sono solo accidentalmente delle sottodirectory di directory incluse nel PYTHONPATH. Infatti questo è l'analogo (per le directory) della restrizione che i file dei moduli devono avere estensione ".py" (o simile, come ".pyc" o ".pyd").
Adesso possiamo lavorare esattamente come prima: possiamo importare un sotto modulo ("import sub.module"), lo possiamo utilizzare con un nome che comprende il prefisso ("sub.module.func(1)"), e possiamo perfino fare importazioni parziali, usando una sintassi come "from sub.modules import func".
Ma l'analogia non è completa: non è possibile fare "from sub import *". Infatti questo significherebbe importare tutti i moduli presenti in una package. Il problema è che Linux è case sensitive, Python è case sensitive, ma per esempio Windows non lo è. E quindi, consentendo un costrutto come quello indicato, si otterrebbe un gran pasticcio: si tratterebbe di importare "Echo, "ECHO" o "echo"?
In pratica, non si riesce a stabilire il nome del modulo (che è sensibile al maiuscolo e il minuscolo) dal nome del file (che in generale NON LO È)! Quindi, in generale, si deve specificare esplicitamente almeno il modulo da importare, dal quale estrarre poi le funzioni e le classi in esso contenute.
Se si vuole supportare la possibilità di importare con "*" una lista dei moduli contenuti in un package, si può fare, a patto che il programmatore abbia utilizzato una variabile, da definire nell'__init__.py. Quando si importa un package, il "__init__.py" viene esplicitamente eseguito e può contenere del generico codice di inizializzazione. Se in questo codice si definisce una lista che si chiama "__all__", questa lista contiene tutti i moduli contenuti nel package. Quindi consideriamo che si abbia nella sottodirectory "demo" un file "__init.py__" che contiene questo:
__all__ = ['Primo', 'secondo', 'TERZO']
verranno importati, a seguito di un comando "from demo import *", i tre moduli, "Primo", "secondo" e "TERZO". E notare che il primo ha l'iniziale minuscola, il secondo è tutto minuscolo e il terzo tutto maiuscolo. I nomi reali sotto Windows potrebbero essere per esempio tutti e tre in MAIUSCOLO (e a volte, in caso di partizioni FAT, è l'unico nome che possono prendere).
Un altro uso di "__init__.py" è quello di consentire l'estensione del package. Infatti, definendo la variabile "__path__" si possono includere altre directory nel package. Questo permette di strutturare un package in molte sottodirectory, per poi importarle tutte con una sola import.
La variabile "__path__" contiene dunque tutte le directory dove vengono contenuti eventuali moduli e sotto-package del package. Può servire per strutturare un programma in molte directory, pur mantenendo comunque una struttura di importazione semplificata. Ovvero si importa il package, e si accede a tutti i moduli.
|