domenica 18 gennaio 2009
Sono finalmente giunto alla fine del PDF beta del libro e devo dire che l'ho trovato davvero pieno di contenuti interessanti. È sicuramente uno splendido esempio di interazioni tra mondi che fino a non molto tempo fa si pensava completamente disconnessi.
Ci sono vantaggi e svantaggi sia nel mondo dei linguaggi statici che in quello dei linguaggi dinamici (io preferisco questi ultimi) e non è questa la sede per affrontare questo discorso ma sicuramente questo libro mostra una serie di scenari non tradizionalmente contemplati che possono tornare molto utili soprattutto nella programmazione Windows lato desktop.
I post di questa serie, oltre al
preambolo, sono:
- introduzione
- introduzione a Python
- oggetti .NET e IronPython
- applicazioni e design pattern
- first class function e XML
- proprietà, dialog e Visual Studio
- testing
- protocolli e metaprogrammazione
- Windows Presentation Foundation
- system administration
- ASP.NET
- accesso ai dati e web service
- Silverlight
- estendere IronPython
- embedding dell'engine di IronPython
Update: ho pubblicato una
recensione sul mio blog in inglese.
L’ultimo capitolo, il 15, riguarda l’embedding del runtime di IronPython all’interno di applicazioni C#/VB.NET e l’interazione con esso.
I post precedenti sono: estendere IronPython, Silverlight, accesso ai dati e web services, ASP.NET, system administration, WPF, protocolli e metaprogrammazione, testing, proprietà, dialog e Visual Studio, first class functions e xml, applicazioni e design pattern, oggetti .NET e IronPython, introduzione a Python, introduzione al libro e il preambolo.
L’embedding di IronPython è sicuramente un comodo modo per fornire un ambiente di scripting ad una applicazione esistente, estenderla con plugin o aumentare l’integrazione fra vari linguaggi.
Ci sono vari modi per fare l’embedding di IronPython.
Eseguibile custom
È possibile distribuire una applicazione Python all’interno di un exe. L’engine di IronPython si crea usando il suo motore di hosting:
using IronPython.Hosting;
ScriptEngine engine = Python.CreateEngine();
ScriptSource source;
source = engine.CreateScriptSourceFromFile(programPath);
ScriptScope scope = enginsource.Execute(scope);
Il DLR supporta la creazione di engine multipli, per i dettagli rimando alle specifiche sull’hosting del DLR.
ScriptSource
e ScriptCode
permettono di eseguire codice Python da file o stringa. È anche possibile catturare eccezioni lanciate dal sorgente Python.
IronPython come motore di scripting
Una cosa veramente esoterica è la possibilità di infilare oggetti nello scope Python (ScriptScope
) da C#, allo stesso modo si possono richiamare oggetti da tale scope. Usando CompiledCode
si possono riusare i code objects senza doverli compilare ogni volta.
L’autore precisa come ScriptScope
non sia legato a Python, in tal modo è potenzialmente possibile mischiare pezzi di codice in Python, Ruby e altri linguaggi del DLR nella stessa applicazione facendoli interagire!
L’esempio che mostra fa uso di varie tecniche compreso l’embedding del sorgente Python in una risorsa per evitarne la modifica dopo il deploy.
Plugin Python per applicazioni .NET
L’autore sviluppa un lungo esempio per mostrare come scrivere plugin per una applicazione .NET mostrando caratteristiche come: l’auto discovery dei plugin, il caricamento a runtime, la redirezione dello standard output ed error dell’hosted runtime e la gestione di specifiche eccezioni da codice Python.
Usare oggetti DLR da altri linguaggi .NET
Le possibilità di avere codice modificabile a runtime senza ricompilazione sono davvero infinite. L’esempio di questa sezione mostra come valutare a runtime pezzi di codice Python e interagire con gli oggetti risultanti da queste valutazioni.
L’autore fa anche notare come con C# 4 l’interazione con i linguaggi dinamici diventerà sicuramente meno verbosa e più potente.
Con il capitolo 14 comincia la quarta e ultima parte del libro che va nei dettagli dell’interazione tra IronPython e il resto di .NET.
Questo capitolo tratta l’estensione di IronPython tramite linguaggi come C# e VB.NET.
I post precedenti sono: Silverlight, accesso ai dati e web services, ASP.NET, system administration, WPF, protocolli e metaprogrammazione, testing, proprietà, dialog e Visual Studio, first class functions e xml, applicazioni e design pattern, oggetti .NET e IronPython, introduzione a Python, introduzione al libro e il preambolo.
IronPython è facilmente estendibile da C# e ci sono tecniche per esporre API Python friendly.
Tecnicamente qualsiasi linguaggio della piattaforma .NET è utilizzabile per estendere IronPython, l’autore si limita ai due principali: C# e VB.NET.
Vari idiomi C# si mappano automaticamente ad IronPython, come l’implementazione di IEnumerable
, IDictionary
, IList
, l’operator overloading e gli indexers. È ovviamente possibile sfruttare la capacità di chiamare codice nativo (unmanaged) di C# da IronPython o addirittura chiamare IronPython da JavaScript in applicazioni Silverlight.
Di base le classi C# non sono mutabili dinamicamente come tutte le classi Python. Per ovviare a questa cosa e abilitare l’accesso dinamico agli attributi si possono usare metodi speciali come GetCustomMember
, SetAfterMember
, DeleteMember
e GetMemberNames
.
.NET supporta metodi con un numero variabile di argomenti, ma non supporta i comodissimi keyword argument emulabili tramite System.Runtime.InteropServices.DefaultParamValueAttribute
oppure OptionalAttribute
.
Trovo davvero interessante la possibilità di compilare e generare assembly a runtime tramite System.CodeDom.Compiler. L’autore mostra un esempio di funzione Generate che permette di farlo attraverso code provider per C# o VB.NET, compilando l’assembly in memoria o salvandola su disco. Questo permette anche di referenziarle a runtime:
import clr
assembly = Generate(source, 'WindowUtils', inMemory=True)
clr.AddReference(assembly)
from WindowUtils import WindowUtils
Davvero interessante :-)
Il capitolo 13 mostra come usare IronPython nel browser attraverso Silverlight.
I post precedenti sono: accesso ai dati e web services, ASP.NET, system administration, WPF, protocolli e metaprogrammazione, testing, proprietà, dialog e Visual Studio, first class functions e xml, applicazioni e design pattern, oggetti .NET e IronPython, introduzione a Python, introduzione al libro e il preambolo.
Le feature di Silverlight sono tutte utilizzabili da IronPython, l’unica cosa di cui si ha bisogno è il Silverlight Dynamic Languages SDK. All’interno dei package xap è possibile accedere ad altri moduli Python ed usare file()
per caricare le risorse. Grazie al manifest file si può evitare di includere nel pacchetto anche le librerie di IronPython e caricarle remotamente, magari condividendole con altre applicazioni Silverlight e avvalendosi del caching HTTP.
Il libro poi mostra un esempio di client Twitter in circa 600 linee di codice spiegando: cross domain policies, come fare il debug, la struttura delle UI, come fare richieste web a terze parti interfacciandosi con la Twitter API, il threading, il supporto asincrono, il client side storage e altro ancora.
Per ovvie ragioni il sandboxing model di JavaScript impedisce le richieste HTTP a domini che non siano quello dell’applicazione, Silverlight invece è leggermente più lasco e permette richieste a domini di terze parti che esplicitamente, tramite una sorta di manifeste, permettono tali richieste. Twitter non è uno di questi quindi l’autore sviluppa un proxy server per ovviare a questo problema.
Le print
di Python non funzionano in Silverlight, ma si può sempre redirezionare lo standard output ad un oggetto che scrive un div sul browser, ad esempio.
WebClient
viene usato per fare le richieste HTTP, in maniera sincrona ed asincrona. L’autore aggiunge degli ID numerici per evitare le policy di caching di questa classe.
XmlReader
ovviamente viene usato per parsare l’XML ritornato dall’API e DispatcherTimer
viene usato per aggiornare la UI.
La classe System.IO.IsolatedStorage
implementa il client side storage salvando 100kb (che a richiesta possono essere aumentati) nella cache del browser.
Gli ultimi esempi mostrano l’uso di video e video brush e l’uso di HtmlPage
per aver completo accesso al DOM, interagire con il JavaScript e XMLHTTPRequest.
Potete usare il Silverlight IronPython Web IDE per sperimentare con Silverlight e IronPython.