domenica 7 dicembre 2008

Python gestire i package [1]

Un package è insieme di moduli disposti in una cartella, che può contenere anche sottocartelle, nella quale possono essere disposti in modo chiaro. Per esempio se noi avessimo una ventina di moduli che servono a manipolare delle immagini potremmo disporli nella stessa cartella del programma che li utilizza ed importarli come semplici moduli(e avremmo una cartella con file .py disposti alla rinfusa) oppure ordinarli in un package dove potrebbero essere disposti in sottopackage, in una struttura ordinata e facile da gestire.

Praticamente un package è una cartella che può contenere delle altre cartelle(sottopackage) dove sono disposti i moduli. Se, riprendendo l'esempio di prima, avessimo delle librerie per manipolare immagini potremmo creare un package cosi:
/immagini               #cartella principale del package
__init__.py #file __init__ per inizializzare il package
/converti #sottopackage coverti che contiene i moduli per convertire le immagini
__init__.py #file __init__ per inizializzare il sottopackage
png.py #modulo png.py
jpg.py
gif.py
/trasforma
__init__.py
ruota.py
scala.py
load.py #modulo che non fa parte di sottopackage ma solo del package
Quando importiamo il package, python cerca nella stessa cartella del programma una sottodirectory che si chiama con lo stesso nome del package e controlla che al suo interno ci sia un file __init__.py.
lo stesso accade quando includiamo un sottopackage.

Il file __init__.py può anche essere un semplice file vuoto oppure può inizializzare il package o settare la variabile globale __all__, che vedremo in un altro post.

Proviamo ora ad importare il package, cosa che è molto simile all'importazione dei moduli:
import immagini.load
Ecco, tutto qui!!! Abbiamo importato il modulo load.py del package immagini. Ora possiamo usarlo come un normale modulo, usando funzioni e classi, specificando però tutto il percorso della libreria:
immagini.load.funzione(attributi)
questo userà una funzione del modulo load. Se non volete scrivere ogni volta tutto ciò potete anche fare:
from immagini import load

load.funzione(attributi)
oppure:
from immagini.load import funzione

funzione(attributi)
o ancora:
from immagini.load import *

funzione(attributi)
L'asterisco indica di importare tutte le funzioni del modulo. Per importare i sottopackage basta usere uno dei tre metodi seguenti, del tutto simili a quelli appena visti:
import immagini.converti.png
from immagini.converti import png
from immagini.converti.png import *
from immagini.converti.png import funzione
Insomma l'import, a parte qualche punto, è del tutto complementare al normale import.

Spero di essere stato chiaro con il mio primo post se avete problemi chiedetemi con i commenti.

Apertura blog

Salve a tutti questo è il mio nuovo blog in cui scriverò alcuni articoli dedicati a python ma senza dimenticare l'Open Source e linux in particolare, che è il mio OS preferito.