1. Parte 2
Programmazione modulare
in Python
Linguaggi dinamici – A.A. 2009/2010
1
2. Introduzione
„ Il primo passo verso una attività di
programmazione che scali con il numero di
righe di codice del software è l'isolamento
de e u o a tà del so t a e
delle funzionalità de software stesso
„ Parti diverse del software
„ “non si vedono” tra loro
„ possono essere scritte indipendentemente da
programmatori diversi
di ersi
„ possono essere cambiate concorrentemente
„ Il Python supporta la modularizzazione tramite
i package ed i moduli
Linguaggi dinamici – A.A. 2009/2010
2
3. Funzione
„ Il Python mette a disposizione un meccanismo
di definizione delle funzioni
„ Parola chiave def
„ Esempio:
E i
def fib(n):
a, b = 0, 1
while b < n:
print b,
a, b = b, a + b
b
Linguaggi dinamici – A.A. 2009/2010
3
4. ÆESEMPI
Funzione
fib.py
fib2.py
„ def deve essere seguito:
„ dal nome della funzione
„ dalla lista dei parametri (fra parentesi tonde),
che vengono passati per valore (reference ad
h ti l ( f d
oggetti)
„ dal
d l corpo della funzione, opportunamente
d ll f i t t
indentato
„ Il valore di ritorno è
l i
„ quello dell'ultima espressione valutata
„ l'argomento dello statement return
Linguaggi dinamici – A.A. 2009/2010
4
5. ÆESEMPI
Funzione
default.py
„ Possono essere specificati degli argomenti di
default nelle funzioni
„ Se non li esplicito, il loro valore è quello di
default
„ Si assegna il valore di default all'argomento
nello statement di definizione della funzione
def ask_ok(prompt, retries = 4, complaint = 'Yes
or no, please!'):
)
...
Linguaggi dinamici – A.A. 2009/2010
5
6. Modulo
„ Il modulo è l'unità di base per il riuso di codice
„ Un modulo è un file contenente definizioni di
variabili e funzioni
„ Il file ha lo stesso nome del modulo ed il
suffisso .py
„ Ad esempio: file Foo.py
„ All'interno del modulo, il nome del modulo
,
stesso è ottenibile tramite la variabile globale
__
__name__ __
Linguaggi dinamici – A.A. 2009/2010
6
7. ÆESEMPI
Importazione dei simboli
fibo.py
„ Un modulo può importare le funzionalità di un
altro modo
„ Statement import name: cerca il modulo nel
percorso dei moduli e ne importa i simboli
„ Statement from name import lista: cerca il
modulo nel percorso dei moduli e ne importa i
simboli definiti nella lista
„ Percorso dei moduli:
„ Directory corrente
„ Elenco di directory in PYTHONPATH
„ Elenco di directory di sistema
(/usr/lib/python2.6)
Linguaggi dinamici – A.A. 2009/2010
7
8. ÆESEMPI
Uso di moduli come programmi
fibo2.py
„ Un modulo può essere usato come programma
principale
„ È necessario capire come si sta usando
„ Uso del valore della variabile __name__
name
„ Se è “__main__”, significa che lo stiamo usando
come programma principale
„ Se è diverso, vuole dire che è usato come
modulo
Linguaggi dinamici – A.A. 2009/2010
8
9. ÆESEMPI
Elenco dei simboli di un modulo
shell
„ Si utilizza la funzione dir() per elencare i
simboli presenti all interno di un modulo
all'interno
import sys
dir(sys)
di ( )
„ Se invocata senza argomenti, la funzione dir()
stampa gli oggetti definiti nell'/dall'interprete
„ Per “oggetti” si intende:
gg
„ funzioni (builtin e non)
„ variabili (builtin e non)
„ moduli
Linguaggi dinamici – A.A. 2009/2010
9
10. Package
„ Il package è un contenitore (namespace) di
simboli (funzioni, variabili)
(funzioni
„ Tipicamente, ad un package corrisponde un file
(non è sempre così)
„ Il compilatore del Python costruisce un
namespace (contenitore di simboli) per
ciascun modulo
„ Namespace di default: package main (
N d f lt k i (contiene
ti
le funzioni eseguite dal programma principale)
„ Namespace: sequenza di nomi separati dal
carattere .
Linguaggi dinamici – A.A. 2009/2010
10
11. Struttura di un package
„ Ad una gerarchia di moduli rappresentata da
un package corrisponde un insieme di file
ordinati gerarchicamente in sottodirectory
„ Esempio: package gestore dei diversi formati
sonori
„ sound: modulo di base
d d l b
„ sound.formats: modulo di gestione dei formati
(wav, aiff, au)
( iff )
„ sound.effects: modulo di gestione degli effetti
(surround, reverse)
( d )
„ sound.filters: modulo di gestione dei filtri
(equalizer, vocoder, karaoke)
Linguaggi dinamici – A.A. 2009/2010
11
12. Struttura di un package
„ __init__.py: file contenente il codice di
inizializzazione di un modulo
„ È presente nella directory che contiene il
package
„ Ciascun modulo ha il suo __init__.py (che può
anche essere vuoto)
„ L'uso di un __init__.py è obbligatorio, altrimenti il
Python non riconosce i file della directory come
appartenenti ad un package
Linguaggi dinamici – A.A. 2009/2010
12
13. Importazione di un package
„ Si usa il comando import
„ Per importare un modulo ben preciso:
import sound.effect.echo
„ Ora, è possibile usare una funzione con di
sound.effect.echo con il suo nome completo
„ sound.effects.echo.echofilter(input, output,
delay=0.7, atten=4)
„ Per evitare l'uso del nome completo, si usa l'altra
variante di import:
from sound.effects.echo import echofilter
d ff t h i t h filt
Linguaggi dinamici – A.A. 2009/2010
13
14. Importazione di un package
„ Lo statement from sound.effect.echo import *
permette di importare tutti i simboli da un
package
„ Sfortunatamente,
Sfortunatamente sui sistemi Windows tale
operazione non funziona sempre come si
vorrebbe
„ I nomi di file di Windows possono essere case
insensitive
i iti
„ ECHO.PY deve venire importato come echo,
Echo
E h oppure ECHO?
Linguaggi dinamici – A.A. 2009/2010
14
15. Importazione di un package
„ Per risolvere tale problema, si definisce una
lista __all__ nel file __init__.py del modulo
all init py
„ Tale lista contiene i simboli esportati tramite
uno statement from module import *
__all__ = ["echo", "surround", "reverse"]
„ Un'ultima nota: import non è ricorsivo!
„ from sound.effects import * non importa anche i
sottomoduli sound.effects.echo,
sound.effects.surround, …
„ Tali moduli vanno importati esplicitamente!
Linguaggi dinamici – A.A. 2009/2010
15
16. Moduli compilati
„ Se un programma importa molti moduli, questo
può rallentare il tempo di avvio
„ Per questo, Python cerca di creare un file
compilato ogni volta che si usa un modulo
„ File con estensione .pyc
„ Contiene b t
C ti bytecode
d
„ Indipendente dalla piattaforma!
„ Gestione flessibile
G f
„ Se non c’è, si prova a crearlo
„ Se non si riesce a creare, si usa il sorgente
„ NOTA: il tempo di esecuzione è lo stesso, si
p ,
risparmia sul caricamento
Linguaggi dinamici – A.A. 2009/2010
16
17. ÆESEMPI
Tempi
lot_mod.py
Linguaggi dinamici – A.A. 2009/2010
17