Un’introduzione a Jython

Print Friendly

Vengono analizzate le principali caratteristiche di questo interessante linguaggio parente di Java

Jython è una versione di Python scritta in Java e realizzata per funzionare con una JVM. Per questo motivo è fortemente integrato con Java e permette ai programmi Jython di accedere alle librerie Java. Ci sono diversi motivi per cui i programmatori Java dovrebbe essere interessati ad imparare Jython:

  • Alternativa allo sviluppo in Javascript per interagire con Java, interessante per le potenzialità e la semplicità
  • E’ molto semplice includere l’interprete Jython nelle applicazioni Java
  • Permette una prototipazione più veloce ed applicazioni “proof of concept” rispetto a Java

 

Dopo questa breve introduzione entriamo subito nel dettaglio del codice. Seguendo lo spirito dei libri di programmazione iniziamo con il semplice “Hello world”, per vedere come sarebbe scritto in Jython

Sicuramente la prima cosa che potete notare a proposito di questo programma è la sua semplicità. Al contrario di Java, Jython non ci obbliga ad utilizzare la programmazione ad oggetti se non vogliamo. Non dobbiamo racchiudere i noistri programmi in una classe o in una funzione.

In realtà questo programma è racchiuso in una classe e in una funzione, per soddisfare i requisiti di Java. Tuttavia Jython nasconde tutto ciò dietro le scene, senza farci preoccupare di niente. Adesso vediamo un esempio leggermente più avanzato

In questo esempio ci sono diversi aspetti significativi di Jython da focalizzare. Il primo è che è poco tipizzato. Infatti non dobbiamo dichiare prima il tipo di variabile che conterrà l’oggetto file.

Il secondo punto da focalizzare riguarda l’uso del costrutto for in Jython, che è differente dal for che siamo abituati ad utilizzare in Java. In Jython un ciclo for esegue il corpo del ciclo, tante volte quanti sono gli oggetti in un insieme che viene fornito, che di solito è una lista o una tupla (una tupla è essenzialmente un array immutabile).

In questo caso abbiamo detto a Jython di inserire tutte le linee del file di testo in una lista di stringhe e, successivamente, di eseguire il ciclo per ogni stringa presente nella lista, ciclo che semplicemente stampa a schermo ogni stringa. La combinazione dell’apertura del file e dell’iterazione sui suoi contenuti mostra quanto sia semplice e veloce in Jython creare ed usare oggetti per semplici compiti.

Se vogliamo un ciclo più tradizionale in Jython possiamo usare la funzione range, la quale dà al ciclo for un intervallo di numeri per effettuare l’iterazione. Per esempio:

ripeterà il ciclo da 0 a 9, aumentando i da 0 a 9 ogni iterazione. L’ultima cosa da notare è che in Jython gli spazi vuoti sono significativi.

Tuttavia prima di appanicarsi e avere dei flashback di FORTRAN, notate che l’uso degli spazi in Jython ha molto senso. Nell’esempio il ciclo è delimitato dall’inizio e dalla fine dell’indentazione. Invece delle parentesi i blocchi di codice Jython sono delimitati dalle indentazioni. Così dobbiamo semplicemente indentare il codice come già facciamo e l’uso degli spazi in Jython ci sembrerà davvero naturale.

 

Oggetti Java e metodi in Jython

Chiaramente, come menzionato all’inizio di questo articolo, uno dei più grandi punti di forza di Jython è la sua capacità di utilizzare librerie Java. Iniziamo quindi a vedere un semplice esempio che utilizza componenti Swing

La maggior parte di questo codice suonerà familiare ai programmatori Java. L’unica differenza è il fatto di non usare la keyword new e di non dover inserire il punto e virgola alla fine dell’istruzione. Anche in questo caso non dobbiamo inserire questo programma in una classe o in un metodo

 

Import in Jython

Gli import che possiamo utilizzare in Jython richiedono un attimo di discussione, visto che possiamo farli in diversi modi. Nell’esempio precedente abbiamo utilizzato la keyword from per importare tutto dal package javax.swing, utilizzando la wildcard *, usando quindi dei nomi di classe non qualificati.

Questo è spesso considerato uno stile errato, perchè porta ad avere un namespace globale. Un altro sistema che possiamo utilizzare è quello di importare soltanto quello che ci serve. Nell’esempio precedente avremmo potuto importare i package nel seguente modo

Anche in questo caso possiamo utilizzare nomi non qualificati nel nostro codice, ma abbiamo ridotto il problema relativo alle collisioni negli import. Un altro modo per importare in Jython è usare import senza from. Ad esempio:

Se facciamo così dobbiamo utilizzare dei nomi qualificati. Ad esempio abbiamo bisogno di scrivere

Anche se abbiamo dovuto scrivere di più, in questo modo non abbiamo “sporcato” il namespace globale.

 

Gestione degli eventi

In Jython la semplice gestione degli eventi è anche più semplice che in Java. Il seguente esempio utilizza un JBotton, al posto della JLabel già vista, per mostrare quanto sia semplice la gestione degli eventi

Ancora una volta questo codice è così semplice che non richiede troppe spiegazioni. Abbiamo semplicemente creato una funzione e l’abbiamo collegata al bottone utilizzando il parametro actionPerformed. L’abbiamo fatto senza dove creare listener o inner classes.

Jython gestisce i laboriosi dettagli riguardanti listener e quant’altro per nostro conto. La nostra funzione, quando è richiamata, riceve un argomento che contiene una lunga lista di proprietà che riguardano l’evento. Se volete vedere questa lista dovete semplicemente aggiungere “print event” alla funzione hello.

Qui c’è un problema che diventa evidente. Noi non abbiamo un modo per passare degli argomenti al gestore degli eventi. Non possiamo fare qualcosa come “hello(5)”. Se provare la coda degli eventi AWT lancerà un eccezione TypeError. Quindi cosa possiamo fare se ci serve di passare degli argomenti?

Possiamo usare una lambda. Per quelli di voi che hanno qualche conoscenza di programmazione con un linguaggio funzionale come LISP, dovreste ricordare che una lambda è una funzione anonima (il nome è preso dal gergo del calcolo matematico, dove descrive una funzione anonima). Quello che dobbiamo fare ora è racchiudere la reale chiamata in una lambda, in modo tale che la coda degli eventi AWT abbia un solo argomento. Ad esempio potremmo scrivere nel seguente modo:

Ad una prima occhiata la sintassi può sembrare strana, ma quello che abbiamo fatto è abbastanza semplice. La funzione lamdba ha due parametri:x, che è la funzione hello , e param, ovvero il valore 5.

Quando actionPerformed viene richiamato la lamdba ritorna una funzione anonima che invoca hello con 5 come argomento. Tuttavia visto che la coda degli eventi AWT gestisce un solo argomento (la funzione anonima ritornata dalla lamdba), è felice e non lancia più eccezioni.

Se ciò vi è sembrato un pò confusionale, considerate che in Jython invece di utilizzare la normale sintassi def nomeFunzione se vogliamo possiamo definire una funzione nel seguente modo

Non è molto ortodosso come metodo ma funziona. Adesso adder è un riferimento alla funzione anonima che prende due parametri e li somma. Possiamo richiamarla come un’altra funzione, ad esempio “adder(5,5)”. Un’interessante effetto collaterale è quello relativo al fatto che la nostra funzione adder è automaticamente polimorfica, a causa dell’operatore +, che in Jython è overloaded. Tutte e tre le seguenti chiamate alla funzione adder sono legali e generano il risultato atteso

Dovete chiaramente pensare a questo aspetto quando scrivete metodi e funzioni in Jython. La maggior parte di quelli che scriverete saranno automaticamente polimorfici perchè la maggior parte delle istruzioni Jython che utilizzerete sono polimorfiche di natura.

Autore originale: Micheal Urban
Traduzione a cura di Federico Paparoni – doc at javastaff dot com
Link all’articolo originale
Discuti con l’autore originale

The following two tabs change content below.

Category: Tool Tags :