ePrometeusCorsoLinuxLinux
testi articoli
Testi Articoli  Download
Home | Espressioni | Comandi | Funzioni | Moduli | Classi | 
CorsoJava è ora Video! Free for all!
Clicca Qui!
Corso Python
Python: Moduli ed Eccezioni
Moduli
Estendere il path
Packages
Eccezioni
Catturare Eccezioni
Gestione eccezioni:
Approfondimento


<<< Packages >>>

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.

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com