SlideShare a Scribd company logo
Introduzione
   Il Python mette a disposizione tutta una serie
     di meccanismi per il metaprogramming
         Introspezione di classi e metodi
         Esecuzione di codice generato dinamicamente
         Gestione degli errori a runtime
   Tali funzionalità sono presenti sotto forma di
     funzioni builtin e di moduli




Linguaggi dinamici – A.A. 2009/2010
                                                         2
Introspezione a livello di sistema
   E' possibile invocare funzionalità di
     introspezione già a livello di interprete da riga
     di comando
   L'interprete interattivo ci fornisce informazioni
     sui moduli installati e sulle loro caratteristiche
   Modulo di sistema sys
         Fornisce informazioni sull'interprete e
           sull'ambiente operativo
         import sys



Linguaggi dinamici – A.A. 2009/2010
                                                          3
Introspezione a livello di sistema
   Alcuni esempi di introspezione
         Nome dell'eseguibile “interprete”:
           sys.executable
         Versione dell'eseguibile “interprete”:
           sys.version
         Nome della piattaforma:
           sys.platform
         Limiti di sistema:
           sys.maxint, sys.maxsize, sys.maxunicode
         Argomenti da linea di comando:
           sys.argv
         Percorso di ricerca dei moduli: sys.path
Linguaggi dinamici – A.A. 2009/2010
                                                      4
Introspezione a livello di sistema
   Una delle variabili esportate da sys permette di
     ottenere l'insieme dei nomi dei moduli visibili
     dall'interprete
   sys.modules: dizionario contenente coppie
     chiave-valore, in cui:
         alla chiave corrisponde il nome completo del
           modulo
         al valore corrisponde il percorso completo della
           versione compilata del modulo




Linguaggi dinamici – A.A. 2009/2010
                                                              5
ESEMPI:
                                                   Person.py
           Introspezione a livello di modulo
   La funzione dir() elenca i simboli di un simbolo
     generico
   Simbolo:
         Nome modulo (oggetto di tipo classe)
         Nome istanza oggetto
         Variabile
         Funzione
   Se invocata senza alcun argomento, dir()
     restituisce i simboli attualmente visibili
     all'interprete

Linguaggi dinamici – A.A. 2009/2010
                                                           6
Introspezione degli oggetti
   E' possibile estrarre informazioni specifiche
     dalle classi e dagli oggetti
         Nome
         Tipo di dato dell'oggetto
         Identità
         Metodi ed attributi
         Relazioni con altre classi




Linguaggi dinamici – A.A. 2009/2010
                                                     7
ESEMPI:
                                                      type.py
             Introspezione degli oggetti                 id.py


   Nome di un simbolo associato ad un oggetto:
     simbolo privato __name__
        nome_simbolo.__name__
   Tipo di un simbolo associato ad un oggetto:
     funzione type()
        type(object)
   Id (identità) di un oggetto: funzione id()
        id(object)
   Confronto di identità: funzione is()
       obj_a is obj_b
       Restituisce True se i due oggetti hanno lo stesso

         id
Linguaggi dinamici – A.A. 2009/2010
                                                             8
ESEMPI:
                                                            attr.py
               Introspezione degli oggetti
   Controllo esistenza di uno specifico attributo
     in un oggetto: funzione hasattr()
         hasattr(object, attribute)
         Restituisce True se object ha l'attributo attribute
         L'attributo può essere una variabile/funzione
   Recupero di uno specifico attributo da un
     oggetto: funzione getattr()
       getattr(object, attribute)
       Equivalente ad object.attribute


   Attribute può essere il contenuto di una variabile
     stringa; pertanto, gli attributi possono essere
     specificati dinamicamente!
Linguaggi dinamici – A.A. 2009/2010
                                                                  9
ESEMPI:
                                                     interrogate.py
               Introspezione degli oggetti
   Controllo invocabilità di un oggetto: funzione
     callable()
         callable(object)
         Restituisce True se object è invocabile
   Relazioni con altre classi:
         metodi isinstance() e issubclass()




Linguaggi dinamici – A.A. 2009/2010
                                                                 10
Subroutine anonime
   E' possibile assegnare a variabili delle funzioni
     (che vengono perciò chiamate subroutine
     anonime)
   In Python, la funzioni anonime sono chiamate
     funzioni lambda
         In onore ad Alonzo Church (1903-1995), ideatore
           del lambda-calcolo e precursore dei linguaggi
           funzionali




Linguaggi dinamici – A.A. 2009/2010
                                                             11
ESEMPI:
                                                         switch.py
                       Subroutine anonime
   Una funzione anonima è definita tramite la
     parola chiave lambda
     variabile = lambda lista_var : espressione
   Ad esempio, la seguente assegnazione associa
     alla variabile f la funzione anonima x^2
     f = lambda x: x^2
   La variabile f punta all'oggetto “funzione
     anonima” rappresentato dall'espressione x^2
         type(f) restituisce, conseguentemente, il tipo
           function


Linguaggi dinamici – A.A. 2009/2010
                                                                12
ESEMPI:
                                                closure1.py
                                      Closure   closure2.py


   In Python, le closure (blocchi di codice cui
     sono associati una o più variabili) possono
     essere implementate in due modi diversi:
       definendo una funzione che restituisce una

         funzione lambda
       definendo una funzione che a sua volta

         definisce e restituisce un'altra funzione




Linguaggi dinamici – A.A. 2009/2010
                                                         13
ESEMPI:
                                                                eval.py
           Generazione dinamica di codice                      exec.py
                                                             execfile.py

   Il Python mette a disposizione meccanismi per
     valutare espressioni e statement
         eval(expr): l'espressione viene analizzata
           sintatticamente e valutata
         exec(stmt): lo statement viene analizzato
           sintatticamente ed interpretato
         execfile(file): il file viene letto, analizzato
           sintatticamente ed interpretato
   E' possibile passare due ulteriori parametri:
     globals (un dizionario di variabili globali), e
     locals (un dizionario di variabili locali)
         eval(expr, globals, locals)
Linguaggi dinamici – A.A. 2009/2010
                                                                      14
ESEMPI:
                                                          compile.py
          Generazione dinamica di codice
   Se la stessa stringa deve essere eseguita più
     volte, conviene precompilarla
   compile(source, filename, mode)
        Compila la stringa source (o, in alternativa, il file
          di nome filename)
        Il parametro mode specifica l'identità
          dell'oggetto prodotto:
             'exec'  sequenza di statement


             'eval'  espressione


             'single'  un singolo statement interattivo


  Viene restituito un code object che può essere
    valutato con eval() o interpretato con exec()
Linguaggi dinamici – A.A. 2009/2010
                                                                  15
ESEMPI:
                                                    exc1.py
          Gestione degli errori a runtime
   Il Python mette a disposizione il costrutto
     try-except-else-finally per gestire le eccezioni
try:
   blocco di codice
except lista_eccezioni:
   blocco di codice
…
else: # eseguito in assenza di eccezioni
   blocco di codice
finally: # eseguito sempre
   blocco di codice
Linguaggi dinamici – A.A. 2009/2010
                                                         16
ESEMPI:
                                                   exc2.py
          Gestione degli errori a runtime
   E' possibile ignorare alcune eccezioni
     associando la relativa lista di nomi allo
     statement nullo pass
try:
   blocco di codice
except lista_eccezioni:
   pass




Linguaggi dinamici – A.A. 2009/2010
                                                        17
ESEMPI:
                                                     exc3.py
          Gestione degli errori a runtime          Myerror.py


   Le eccezioni possono essere invocate dal
     programmatore tramite l'istruzione raise
     raise NomeEccezione(Lista_Argomenti)
   L'elenco delle eccezioni è consultabile al
     seguente indirizzo: http://docs.python.org/
     library/exceptions.html
   E' possibile definire nuove eccezioni
     estendendo la classe Exception




Linguaggi dinamici – A.A. 2009/2010
                                                           18

More Related Content

What's hot

Inferno Limbo Italian
Inferno Limbo ItalianInferno Limbo Italian
Inferno Limbo Italian
Alberto Minetti
 
Pe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingPe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingMajong DevJfu
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
Marco Parenzan
 
Pe t2 perl-caratteristiche
Pe t2 perl-caratteristichePe t2 perl-caratteristiche
Pe t2 perl-caratteristicheMajong DevJfu
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
Edmondo Porcu
 
Python@Unina - Theory
Python@Unina - TheoryPython@Unina - Theory
Python@Unina - Theory
NaLUG
 
Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48h
FLT.lab
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in Java
Cristina Attori
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partI
MobileSchool
 
Bash programming
Bash programmingBash programming
Bash programming
Sebastiano Merlino (eTr)
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
PyCon Italia
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
K-Tech Formazione
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio cughetta
 

What's hot (20)

Inferno Limbo Italian
Inferno Limbo ItalianInferno Limbo Italian
Inferno Limbo Italian
 
Pe t3 perl-moduli
Pe t3 perl-moduliPe t3 perl-moduli
Pe t3 perl-moduli
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
Pe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingPe a3 perl-metaprogramming
Pe a3 perl-metaprogramming
 
2006 Py01 intro
2006 Py01 intro2006 Py01 intro
2006 Py01 intro
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
Pe t2 perl-caratteristiche
Pe t2 perl-caratteristichePe t2 perl-caratteristiche
Pe t2 perl-caratteristiche
 
Pe t1 perl-intro
Pe t1 perl-introPe t1 perl-intro
Pe t1 perl-intro
 
Pe t4 perl-oggetti
Pe t4 perl-oggettiPe t4 perl-oggetti
Pe t4 perl-oggetti
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 
T3 esempio runtime
T3 esempio runtimeT3 esempio runtime
T3 esempio runtime
 
Python@Unina - Theory
Python@Unina - TheoryPython@Unina - Theory
Python@Unina - Theory
 
Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48h
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in Java
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partI
 
Bash programming
Bash programmingBash programming
Bash programming
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio c
 
11 I File
11   I File11   I File
11 I File
 

Viewers also liked

Py a1 python-unit_testing
Py a1 python-unit_testingPy a1 python-unit_testing
Py a1 python-unit_testingMajong DevJfu
 
Pe a1 perl-unit_testing
Pe a1 perl-unit_testingPe a1 perl-unit_testing
Pe a1 perl-unit_testingMajong DevJfu
 
Corso Python Django
Corso Python DjangoCorso Python Django
Corso Python Djangobarmassimo
 
Pe a2 perl-documentazione
Pe a2 perl-documentazionePe a2 perl-documentazione
Pe a2 perl-documentazioneMajong DevJfu
 
9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
Penetration Testing con Python - Network Sniffer
Penetration Testing con Python - Network SnifferPenetration Testing con Python - Network Sniffer
Penetration Testing con Python - Network Sniffer
Simone Onofri
 

Viewers also liked (15)

Py a1 python-unit_testing
Py a1 python-unit_testingPy a1 python-unit_testing
Py a1 python-unit_testing
 
Pycon
PyconPycon
Pycon
 
Pe a1 perl-unit_testing
Pe a1 perl-unit_testingPe a1 perl-unit_testing
Pe a1 perl-unit_testing
 
T4 tipizzazione
T4 tipizzazioneT4 tipizzazione
T4 tipizzazione
 
T1 introduzione
T1 introduzioneT1 introduzione
T1 introduzione
 
T2 architettura
T2 architetturaT2 architettura
T2 architettura
 
T5 memoria
T5 memoriaT5 memoria
T5 memoria
 
T8 supporti
T8 supportiT8 supporti
T8 supporti
 
UE week 2
UE week 2UE week 2
UE week 2
 
T6 codice
T6 codiceT6 codice
T6 codice
 
Corso Python Django
Corso Python DjangoCorso Python Django
Corso Python Django
 
Py a5 python-text
Py a5 python-textPy a5 python-text
Py a5 python-text
 
Pe a2 perl-documentazione
Pe a2 perl-documentazionePe a2 perl-documentazione
Pe a2 perl-documentazione
 
9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
Penetration Testing con Python - Network Sniffer
Penetration Testing con Python - Network SnifferPenetration Testing con Python - Network Sniffer
Penetration Testing con Python - Network Sniffer
 

Similar to Py a3 python-metaprogramming

Le funzioni in javascript
Le funzioni in javascriptLe funzioni in javascript
Le funzioni in javascript
PaoloCaramanica
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of Kotlin
Erik Minarini
 
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
Felice Pescatore
 
C# Language Evolution
C# Language EvolutionC# Language Evolution
C# Language Evolution
Marco Parenzan
 
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
From The Front
 
Introduzione a scala prima parte
Introduzione a scala   prima parteIntroduzione a scala   prima parte
Introduzione a scala prima parte
Onofrio Panzarino
 
Ripasso funzioni
Ripasso funzioniRipasso funzioni
Ripasso funzioni
marckmart
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
Marco Parenzan
 
Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Scala Programming Linux Day 2009
Scala Programming Linux Day 2009
Massimiliano Dessì
 
Programmazione Funzionale per tutti
Programmazione Funzionale per tuttiProgrammazione Funzionale per tutti
Programmazione Funzionale per tutti
Salvatore Sorrentino
 
Vb.Net
Vb.NetVb.Net
Data mining 04-funzionicustom-classioggetti
Data mining 04-funzionicustom-classioggettiData mining 04-funzionicustom-classioggetti
Data mining 04-funzionicustom-classioggetti
Studiabo
 
OOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni LambdaOOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni Lambda
Gruppo Musa ICT - Web, Marketing ed Assistenze
 
Strategie Per Un Lor Federato
Strategie Per Un Lor FederatoStrategie Per Un Lor Federato
Strategie Per Un Lor Federato
Marcello Giacomantonio
 
Strutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggettiStrutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggetti
Studiabo
 

Similar to Py a3 python-metaprogramming (20)

Le funzioni in javascript
Le funzioni in javascriptLe funzioni in javascript
Le funzioni in javascript
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of Kotlin
 
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
 
C# Language Evolution
C# Language EvolutionC# Language Evolution
C# Language Evolution
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
 
Introduzione a scala prima parte
Introduzione a scala   prima parteIntroduzione a scala   prima parte
Introduzione a scala prima parte
 
Ripasso funzioni
Ripasso funzioniRipasso funzioni
Ripasso funzioni
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
Programming iOS lezione 3
Programming iOS lezione 3Programming iOS lezione 3
Programming iOS lezione 3
 
Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Scala Programming Linux Day 2009
Scala Programming Linux Day 2009
 
Programmazione Funzionale per tutti
Programmazione Funzionale per tuttiProgrammazione Funzionale per tutti
Programmazione Funzionale per tutti
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 
Data mining 04-funzionicustom-classioggetti
Data mining 04-funzionicustom-classioggettiData mining 04-funzionicustom-classioggetti
Data mining 04-funzionicustom-classioggetti
 
Lezione01
Lezione01Lezione01
Lezione01
 
Lezione01
Lezione01Lezione01
Lezione01
 
OOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni LambdaOOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni Lambda
 
Strategie Per Un Lor Federato
Strategie Per Un Lor FederatoStrategie Per Un Lor Federato
Strategie Per Un Lor Federato
 
Strutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggettiStrutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggetti
 
Presentazione java7
Presentazione java7Presentazione java7
Presentazione java7
 

More from Majong DevJfu

8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 
25 architectural adaptation
25 architectural adaptation25 architectural adaptation
25 architectural adaptationMajong DevJfu
 

More from Majong DevJfu (20)

8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 
25 architectural adaptation
25 architectural adaptation25 architectural adaptation
25 architectural adaptation
 

Py a3 python-metaprogramming

  • 1.
  • 2. Introduzione Il Python mette a disposizione tutta una serie di meccanismi per il metaprogramming Introspezione di classi e metodi Esecuzione di codice generato dinamicamente Gestione degli errori a runtime Tali funzionalità sono presenti sotto forma di funzioni builtin e di moduli Linguaggi dinamici – A.A. 2009/2010 2
  • 3. Introspezione a livello di sistema E' possibile invocare funzionalità di introspezione già a livello di interprete da riga di comando L'interprete interattivo ci fornisce informazioni sui moduli installati e sulle loro caratteristiche Modulo di sistema sys Fornisce informazioni sull'interprete e sull'ambiente operativo import sys Linguaggi dinamici – A.A. 2009/2010 3
  • 4. Introspezione a livello di sistema Alcuni esempi di introspezione Nome dell'eseguibile “interprete”: sys.executable Versione dell'eseguibile “interprete”: sys.version Nome della piattaforma: sys.platform Limiti di sistema: sys.maxint, sys.maxsize, sys.maxunicode Argomenti da linea di comando: sys.argv Percorso di ricerca dei moduli: sys.path Linguaggi dinamici – A.A. 2009/2010 4
  • 5. Introspezione a livello di sistema Una delle variabili esportate da sys permette di ottenere l'insieme dei nomi dei moduli visibili dall'interprete sys.modules: dizionario contenente coppie chiave-valore, in cui: alla chiave corrisponde il nome completo del modulo al valore corrisponde il percorso completo della versione compilata del modulo Linguaggi dinamici – A.A. 2009/2010 5
  • 6. ESEMPI: Person.py Introspezione a livello di modulo La funzione dir() elenca i simboli di un simbolo generico Simbolo: Nome modulo (oggetto di tipo classe) Nome istanza oggetto Variabile Funzione Se invocata senza alcun argomento, dir() restituisce i simboli attualmente visibili all'interprete Linguaggi dinamici – A.A. 2009/2010 6
  • 7. Introspezione degli oggetti E' possibile estrarre informazioni specifiche dalle classi e dagli oggetti Nome Tipo di dato dell'oggetto Identità Metodi ed attributi Relazioni con altre classi Linguaggi dinamici – A.A. 2009/2010 7
  • 8. ESEMPI: type.py Introspezione degli oggetti id.py Nome di un simbolo associato ad un oggetto: simbolo privato __name__ nome_simbolo.__name__ Tipo di un simbolo associato ad un oggetto: funzione type() type(object) Id (identità) di un oggetto: funzione id() id(object) Confronto di identità: funzione is() obj_a is obj_b Restituisce True se i due oggetti hanno lo stesso id Linguaggi dinamici – A.A. 2009/2010 8
  • 9. ESEMPI: attr.py Introspezione degli oggetti Controllo esistenza di uno specifico attributo in un oggetto: funzione hasattr() hasattr(object, attribute) Restituisce True se object ha l'attributo attribute L'attributo può essere una variabile/funzione Recupero di uno specifico attributo da un oggetto: funzione getattr() getattr(object, attribute) Equivalente ad object.attribute Attribute può essere il contenuto di una variabile stringa; pertanto, gli attributi possono essere specificati dinamicamente! Linguaggi dinamici – A.A. 2009/2010 9
  • 10. ESEMPI: interrogate.py Introspezione degli oggetti Controllo invocabilità di un oggetto: funzione callable() callable(object) Restituisce True se object è invocabile Relazioni con altre classi: metodi isinstance() e issubclass() Linguaggi dinamici – A.A. 2009/2010 10
  • 11. Subroutine anonime E' possibile assegnare a variabili delle funzioni (che vengono perciò chiamate subroutine anonime) In Python, la funzioni anonime sono chiamate funzioni lambda In onore ad Alonzo Church (1903-1995), ideatore del lambda-calcolo e precursore dei linguaggi funzionali Linguaggi dinamici – A.A. 2009/2010 11
  • 12. ESEMPI: switch.py Subroutine anonime Una funzione anonima è definita tramite la parola chiave lambda variabile = lambda lista_var : espressione Ad esempio, la seguente assegnazione associa alla variabile f la funzione anonima x^2 f = lambda x: x^2 La variabile f punta all'oggetto “funzione anonima” rappresentato dall'espressione x^2 type(f) restituisce, conseguentemente, il tipo function Linguaggi dinamici – A.A. 2009/2010 12
  • 13. ESEMPI: closure1.py Closure closure2.py In Python, le closure (blocchi di codice cui sono associati una o più variabili) possono essere implementate in due modi diversi: definendo una funzione che restituisce una funzione lambda definendo una funzione che a sua volta definisce e restituisce un'altra funzione Linguaggi dinamici – A.A. 2009/2010 13
  • 14. ESEMPI: eval.py Generazione dinamica di codice exec.py execfile.py Il Python mette a disposizione meccanismi per valutare espressioni e statement eval(expr): l'espressione viene analizzata sintatticamente e valutata exec(stmt): lo statement viene analizzato sintatticamente ed interpretato execfile(file): il file viene letto, analizzato sintatticamente ed interpretato E' possibile passare due ulteriori parametri: globals (un dizionario di variabili globali), e locals (un dizionario di variabili locali) eval(expr, globals, locals) Linguaggi dinamici – A.A. 2009/2010 14
  • 15. ESEMPI: compile.py Generazione dinamica di codice Se la stessa stringa deve essere eseguita più volte, conviene precompilarla compile(source, filename, mode) Compila la stringa source (o, in alternativa, il file di nome filename) Il parametro mode specifica l'identità dell'oggetto prodotto: 'exec' sequenza di statement 'eval' espressione 'single' un singolo statement interattivo Viene restituito un code object che può essere valutato con eval() o interpretato con exec() Linguaggi dinamici – A.A. 2009/2010 15
  • 16. ESEMPI: exc1.py Gestione degli errori a runtime Il Python mette a disposizione il costrutto try-except-else-finally per gestire le eccezioni try: blocco di codice except lista_eccezioni: blocco di codice … else: # eseguito in assenza di eccezioni blocco di codice finally: # eseguito sempre blocco di codice Linguaggi dinamici – A.A. 2009/2010 16
  • 17. ESEMPI: exc2.py Gestione degli errori a runtime E' possibile ignorare alcune eccezioni associando la relativa lista di nomi allo statement nullo pass try: blocco di codice except lista_eccezioni: pass Linguaggi dinamici – A.A. 2009/2010 17
  • 18. ESEMPI: exc3.py Gestione degli errori a runtime Myerror.py Le eccezioni possono essere invocate dal programmatore tramite l'istruzione raise raise NomeEccezione(Lista_Argomenti) L'elenco delle eccezioni è consultabile al seguente indirizzo: http://docs.python.org/ library/exceptions.html E' possibile definire nuove eccezioni estendendo la classe Exception Linguaggi dinamici – A.A. 2009/2010 18