Lawrence http://blogs.ugidotnet.org/lawrence/Default.aspx Twist again it-IT Lawrence Oluyede Subtext Version 2.6.0.0 Lawrence http://blogs.ugidotnet.org/images/RSS2Image.gif http://blogs.ugidotnet.org/lawrence/Default.aspx 77 60 IronPython in Action, considerazioni finali ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-considerazioni-finali.aspx 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.<br /> <br /> 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.<br /> <br /> I post di questa serie, oltre al <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>, sono:<br /> <ol> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a><br /> </li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class function e XML</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx">Windows Presentation Foundation</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx">system administration</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx">ASP.NET</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-accesso-ai-dati-e-webservice.aspx">accesso ai dati e web service</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-silverlight.aspx">Silverlight</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-estendere-ironpython.aspx">estendere IronPython</a></li> <li><a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-embedding-dellironpython-engine.aspx">embedding dell'engine di IronPython</a></li> </ol> <span style="font-weight: bold;">Update: </span>ho pubblicato una <a href="http://www.oluyede.org/blog/2009/01/19/ironpython-in-action-book-review/">recensione</a> sul mio blog in inglese.<img src="http://blogs.ugidotnet.org/lawrence/aggbug/95232.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-considerazioni-finali.aspx Sun, 18 Jan 2009 17:28:53 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-considerazioni-finali.aspx#feedback 2 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95232.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95232.aspx IronPython in Action, embedding dell'IronPython engine ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-embedding-dellironpython-engine.aspx <p>L’ultimo capitolo, il 15, riguarda l’embedding del runtime di IronPython all’interno di applicazioni C#/VB.NET e l’interazione con esso.</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-estendere-ironpython.aspx">estendere IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-silverlight.aspx">Silverlight</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-accesso-ai-dati-e-webservice.aspx">accesso ai dati e web services</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx">ASP.NET</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx">system administration</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx">WPF</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>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.</p> <p>Ci sono vari modi per fare l’embedding di IronPython.</p> <h4 id="eseguibile_custom">Eseguibile custom</h4> <p>È possibile distribuire una applicazione Python all’interno di un <em>exe</em>. L’engine di IronPython si crea usando il suo motore di hosting:</p> <pre><code>using IronPython.Hosting;<br />ScriptEngine engine = Python.CreateEngine();<br />ScriptSource source;<br />source = engine.CreateScriptSourceFromFile(programPath);<br />ScriptScope scope = enginsource.Execute(scope);<br /></code></pre> <p>Il DLR supporta la creazione di engine multipli, per i dettagli rimando alle <a href="http://compilerlab.members.winisp.net/dlr-spec-hosting.doc">specifiche sull’hosting del DLR</a>.</p> <p><code>ScriptSource</code> e <code>ScriptCode</code> permettono di eseguire codice Python da file o stringa. È anche possibile catturare eccezioni lanciate dal sorgente Python.</p> <h4 id="ironpython_come_motore_di_scripting">IronPython come motore di scripting</h4> <p>Una cosa veramente <em>esoterica</em> è la possibilità di infilare oggetti nello scope Python (<code>ScriptScope</code>) da C#, allo stesso modo si possono richiamare oggetti da tale scope. Usando <code>CompiledCode</code> si possono riusare i <em>code objects</em> senza doverli compilare ogni volta.</p> <p>L’autore precisa come <code>ScriptScope</code> 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!</p> <p>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.</p> <h4 id="plugin_python_per_applicazioni_net">Plugin Python per applicazioni .NET</h4> <p>L’autore sviluppa un lungo esempio per mostrare come scrivere plugin per una applicazione .NET mostrando caratteristiche come: l’<em>auto discovery</em> dei plugin, il caricamento a runtime, la redirezione dello standard output ed error dell’<em>hosted runtime</em> e la gestione di specifiche eccezioni da codice Python.</p> <h4 id="usare_oggetti_dlr_da_altri_linguaggi_net">Usare oggetti DLR da altri linguaggi .NET</h4> <p>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.</p> <p>L’autore fa anche notare come <a href="http://blogs.msdn.com/charlie/archive/2008/01/25/future-focus.aspx">con C# 4</a> l’interazione con i linguaggi dinamici diventerà sicuramente meno verbosa e più potente.</p><img src="http://blogs.ugidotnet.org/lawrence/aggbug/95230.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-embedding-dellironpython-engine.aspx Sun, 18 Jan 2009 17:09:07 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-embedding-dellironpython-engine.aspx#feedback http://blogs.ugidotnet.org/lawrence/comments/commentRss/95230.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95230.aspx IronPython in Action, estendere IronPython ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-estendere-ironpython.aspx <p>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.</p> <p>Questo capitolo tratta l’estensione di IronPython tramite linguaggi come C# e VB.NET.</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-silverlight.aspx">Silverlight</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-accesso-ai-dati-e-webservice.aspx">accesso ai dati e web services</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx">ASP.NET</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx">system administration</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx">WPF</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>IronPython è facilmente estendibile da C# e ci sono tecniche per esporre API <em>Python friendly</em>.</p> <p>Tecnicamente qualsiasi linguaggio della piattaforma .NET è utilizzabile per estendere IronPython, l’autore si limita ai due principali: C# e VB.NET.</p> <p>Vari idiomi C# si mappano automaticamente ad IronPython, come l’implementazione di <code>IEnumerable</code>, <code>IDictionary</code>, <code>IList</code>, l’operator overloading e gli indexers. È ovviamente possibile sfruttare la capacità di chiamare codice nativo (<em>unmanaged</em>) di C# da IronPython o addirittura chiamare IronPython da JavaScript in applicazioni Silverlight.</p> <p>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 <code>GetCustomMember</code>, <code>SetAfterMember</code>, <code>DeleteMember</code> e <code>GetMemberNames</code>.</p> <p>.NET supporta metodi con un numero variabile di argomenti, ma non supporta i comodissimi keyword argument emulabili tramite <code>System.Runtime.InteropServices.DefaultParamValueAttribute</code> oppure <code>OptionalAttribute</code>.</p> <p>Trovo davvero interessante la possibilità di compilare e generare assembly a runtime tramite <a href="http://msdn.microsoft.com/en-us/library/system.codedom.compiler.aspx">System.CodeDom.Compiler</a>. L’autore mostra un esempio di funzione <em>Generate</em> che permette di farlo attraverso <em>code provider</em> per C# o VB.NET, compilando l’assembly in memoria o salvandola su disco. Questo permette anche di referenziarle a runtime:</p> <pre><code>import clr<br />assembly = Generate(source, 'WindowUtils', inMemory=True)<br />clr.AddReference(assembly)<br />from WindowUtils import WindowUtils<br /></code></pre> <p>Davvero interessante :-)</p><img src="http://blogs.ugidotnet.org/lawrence/aggbug/95227.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-estendere-ironpython.aspx Sun, 18 Jan 2009 14:45:02 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-estendere-ironpython.aspx#feedback http://blogs.ugidotnet.org/lawrence/comments/commentRss/95227.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95227.aspx IronPython in Action, Silverlight ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-silverlight.aspx <p>Il capitolo 13 mostra come usare IronPython nel browser attraverso Silverlight.</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-accesso-ai-dati-e-webservice.aspx">accesso ai dati e web services</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx">ASP.NET</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx">system administration</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx">WPF</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>Le feature di Silverlight sono tutte utilizzabili da IronPython, l’unica cosa di cui si ha bisogno è il <a href="http://www.codeplex.com/sdlsdk">Silverlight Dynamic Languages SDK</a>. All’interno dei package <em>xap</em> è possibile accedere ad altri moduli Python ed usare <code>file()</code> 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.</p> <p>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.</p> <p>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.</p> <p>Le <code>print</code> 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.</p> <p><code>WebClient</code> 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.</p> <p><code>XmlReader</code> ovviamente viene usato per parsare l’XML ritornato dall’API e <code>DispatcherTimer</code> viene usato per aggiornare la UI.</p> <p>La classe <code>System.IO.IsolatedStorage</code> implementa il client side storage salvando 100kb (che a richiesta possono essere aumentati) nella cache del browser.</p> <p>Gli ultimi esempi mostrano l’uso di video e video brush e l’uso di <code>HtmlPage</code> per aver completo accesso al DOM, interagire con il JavaScript e XMLHTTPRequest.</p> <p>Potete usare il <a href="http://www.voidspace.org.uk/ironpython/webide/webide.html">Silverlight IronPython Web IDE</a> per sperimentare con Silverlight e IronPython. </p><img src="http://blogs.ugidotnet.org/lawrence/aggbug/95226.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-silverlight.aspx Sun, 18 Jan 2009 13:46:18 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/18/ironpython-in-action-silverlight.aspx#feedback 1 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95226.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95226.aspx IronPython In Action, accesso ai dati e webservice ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-accesso-ai-dati-e-webservice.aspx <p>Il capitolo 12 affronta l’accesso ai dati ed i web services (sia SOAP style che REST).</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx">ASP.NET</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx">system administration</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx">WPF</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>L’esempio sviluppato dal libro in questo capitolo sfrutta ADO.NET, il database opensource <a href="http://www.postgresql.org/download/windows">PostgreSQL</a> e il data provider <a href="http://npgsql.projects.postgresql.org/">Npgsql</a>.</p> <p>Personalmente mi sento di consigliarvi PostgreSQL che non ha nulla da invidiare a SQL Server e se lavorate con GIS <a href="http://postgis.refractions.net/">è decisamente una figata</a>. Quì dove lavoor io lo usiamo felicemente per applicazioni di produzione (usiamo anche SQL Server 2000, SQL Server 2005, SQLite e credo anche MySQL).</p> <p>L’esempio è, prevedibilmente, un programma che sfrutta il provider per fare query, usare <em>bind variables</em>, transazioni e sfruttare i <em>data adapters</em>.</p> <p>La parte sui web services invece comincia mostrando un esempio che consuma un feed Atom per poi buttarsi sul consumo di un servizio SOAP, <a href="(http://www.dotnetjunkies.com/quickstart/aspplus/samples/services/MathService/CS/MathService.asmx">MathService</a>.</p> <p>Sfrutta tool come <em>wsdl.exe</em> per creare una dll proxy del servizio remoto e la usa da Python normalmente:</p> <pre><code>&gt;&gt;&gt; import clr &gt;&gt;&gt; clr.AddReference('MathService.dll') &gt;&gt;&gt; from MathService import MathService &gt;&gt;&gt; service = MathService() &gt;&gt;&gt; service.Add(3, 4) 7.0 </code></pre> <p>Data la dinamicità di Python i proxy possono essere creati anche a runtime, ovviamente. Purtroppo però, dato che IronPython non supporta direttamente gli attributi, non è possibile creare un webservice SOAP.</p> <p>Fortuna vuole che per REST e HTTP le cose siano più semplici. L’autore a questo punto sviluppa un intero servizio REST in IronPython per gestire delle note (composte da titolo, corpo e id). Sostanzialmente oltre ai vari verbi HTTP fa uso di <code>WebRequest</code>, <code>HttpListener</code>, <code>HttpUtility</code> e un po’ di XML.</p> <p>Una delle applicazioni che abbiamo sviluppato è una web application che espone anche un REST web service consumabile in vari linguaggi in maniera molto intuitiva. Purtroppo, secondo la mia esperienza, devo dare ragione a chi si lamenta della poca interoperabilità di SOAP tra vari ambienti. Mi è capitato di sputare parecchio sangue per interfacciarmi a web service esposti da Java che si comportano in modo diverso da quelli SOAP esposti da .NET (direttamente da SQL Server).</p> <img src="http://blogs.ugidotnet.org/lawrence/aggbug/95176.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-accesso-ai-dati-e-webservice.aspx Mon, 12 Jan 2009 18:40:40 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-accesso-ai-dati-e-webservice.aspx#feedback 1 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95176.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95176.aspx IronPython In Action, ASP.NET ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx <p>Il capitolo 11 comincia con una introduzione ad ASP.NET per poi buttarsi nello sviluppo di un clone web dell’applicazione <em>MultiDoc</em> realizzata precedentemente sul framework <em>Windows.Forms</em>.</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx">system administration</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx">WPF</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>Per usare IronPython con ASP.NET oltre Visual Web Developer Express o Visual Studio si ha bisogno anche di <a href="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=aspnet&amp;DownloadId=44351">IronPython for ASP.NET</a> disponibile sia per la versione classica (quella usata dal libro) che per la versione MVC di ASP.NET. I dettagli dell’integrazioen sono specificati in un apposito whitepaper: <a href="http://www.asp.net/DynamicLanguages/whitepaper/">The New Dynamic Language Extensibility Model for ASP.NET</a>.</p> <p>La cosa interessante è che IronPython è perfettamente integrato nel debugger visuale, per cui non si perde niente in questa fase.</p> <p>Dopo aver installato il pacchetto di integrazione il libro comincia a sviluppare l’applicazione <em>MultiDoc</em> sfruttando alcune feature, il <em>Global.py</em>, per avere a disposizione tutta la libreria standard di Python da ASP.NET.</p> <p>Il primo esempio è sostanzialmente un excursus su controlli quali il <code>Repeater</code> ed eventi come <em>Page_Load</em> e <em>Page_Prender</em>.</p> <p>Dopo aver introdotto il concetto di <em>viewstate</em> fa notare come la personalizzazione della serializzazione dello stesso non sia disponibile direttamente da IronPython. In pratica <em>SaveViewState</em> e <em>LoadViewState</em> non sono direttamente accessibili, alché usa una classe C# (evviva l’ambiente multi linguaggio!) per ovviare al problema.</p> <p>In seguito, necessitando di serializzare oggetti Python, evidenzia come questi ultimi non siano direttamente gestibili dalla machinery del viewstate. Il trucco sta nell’usare la classe <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.pair.aspx">System.Web.UI.Pair</a> e la serializzazione Python (<em>pickling</em>) abbinando i due nello stato del <em>viewstate</em>. Un trucco davvero carino, perché in tal modo si può serializare qualunque cosa ;-)</p> <p>Il capitolo termina con la trasformazione della parte di editing dei <em>MultiDoc</em> in uno <em>user control</em> di ASP.NET.</p> <p>L’autore fa notare come l’integrazione non sia appunto ancora totale, speriamo in futuro.</p> <img src="http://blogs.ugidotnet.org/lawrence/aggbug/95175.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx Mon, 12 Jan 2009 18:17:29 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/12/ironpython-in-action-asp.net.aspx#feedback 1 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95175.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95175.aspx IronPython In Action, windows system administration http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx <p>Il capitolo 10 fa notare come IronPython possa essere usato nelle attività di amministrazione di Windows giornalmente.</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx">WPF</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>L’autore si butta nell’interfacciamento a WMI e PowerShell. Personalmente non immaginavo nemmeno che si potesse integrare PowerShell dentro IronPython e viceversa. Stellare :-)</p> <p>La forza di Python nell’amministrazione di sistema sta nella versatilità, nella possibilità di usare il paradigma che si preferisce e nel fatto di avere tutta la ricchissima libreria a disposizione anche per i semplici script. È usato giornalmente per interfacciarsi agli ambienti Unix, a Win32 e per qualsiasi tipo di automazione nel sistema operativo.</p> <p>Python ha un sacco di moduli per l’amministrazione di sistema: <code>os</code> per la gestione del sistema operativo (compresa la gestione di processi), <code>os.path</code> per i path, <code>sys</code> per le informazioni del sistema e gli standard input, output ed error, <code>stat</code> per gestire gli attributi dei file, <code>shutil</code> per operazioni di <em>copy</em>, <em>move</em> e <em>delete</em> ad alto livello e altri ancora.</p> <p>Per mostrare tutto ciò l’autore crea un sottoinsieme dell’utility <a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?find">find</a> di Unix (utilissa se volete trovare dei file in un albero di directory). Questo gli permette di dimostrare il parsing della linea di comando, la lettura di file INI, la navigazione delle directory ricorsivamente (usando generatori) e il pattern matching sui nomi dei file.</p> <p>Un’altra tecnologia utilissima è <em>WMI</em> per ricavare informazioni dal sistema operativo sui processi, sulle macchine, sulla rete ecc. ecc. Usando <code>System.Management</code> e <em>WQL</em> si possono fare cose davvero interessanti ;-)</p> <p>Il capitolo si conclude con una serie di esempi davvero <em>esoterici</em> dove si mostrano le interazioni tra PowerShell e IronPython in entrambi i sensi. Addirittura si possono usare i blocchi di PowerShell come event handler da IronPython!!</p> <p>Ah, IronPython, ovviamente, può interagire anche con COM.</p> <img src="http://blogs.ugidotnet.org/lawrence/aggbug/95161.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx Sun, 11 Jan 2009 16:09:28 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-windows-system-administration.aspx#feedback 1 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95161.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95161.aspx IronPython In Action, WPF e IronPython ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx <p>La terza parte del libro si butta intensamente sull’uso di IronPython negli scenari più disparati di .NET. Da WPF a PowerShell a ASP.NET a praticamente qualsiasi cosa sia usabile in .NET.</p> <p>Il capitolo 9 tratta Windows Presentation Foundation.</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx">protocolli e metaprogrammazione</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>Il capitolo parte con una introduzione a WPF e continua presentando un esempio di UI sviluppata in WPF via codice e un altro esempio sviluppato usando XAML (caricato via codice tramite la classe <code>System.Windows.Markup.XamlReader</code>).</p> <p>Fa riferimento ai vari tool per progettare UI visualmente: IronPython Studio, Visual Studio ed Expression Blend. Insomma, ce ne sono parecchi di modi :-)</p> <p>Il secondo esempio in cui si butta l’autore è una UI più ricca che fa uso di varie controlli tra cui: <code>Grid</code>, <code>ComboBox</code>, <code>CheckBox</code>, <code>Image</code>, <code>Expander</code>, <code>ScrollViewer</code>, <code>TextBlock</code>.</p> <p>Altri esempi includono l’uso della classe <code>XamlWriter</code> per serializzare le UI in XAML e la visualizzazione di documenti XPS dentro una applicazione WPF.</p> <p>Come potete immaginare c’è un sacco di materiale in questo libro.</p> <img src="http://blogs.ugidotnet.org/lawrence/aggbug/95160.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx Sun, 11 Jan 2009 15:38:47 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/11/ironpython-in-action-wpf-e-ironpython.aspx#feedback 1 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95160.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95160.aspx IronPython In Action, protocolli, metaprogrammazione e altro ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx <p>Il capitolo 8 si butta in profondità sui concetti di protocollo, metaprogrammazione e spiega l’interfacciamento di IronPython con .NET nei casi meno ovvi.</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx">testing</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>Personalmente direi che arrivati al capitolo 8 (approfondendo con la documentazione di Python) si possiede una buona base per essere autonomi.</p> <p>I protocolli, comunque, sono interfacce soft che funzionano tramite il <em>duck typing</em> senza alcun tipo di forzatura a compile time.</p> <p>Esistono dei pacchetti, come <a href="http://www.zope.org/Products/ZopeInterface">zope.interface</a>, che aiutano a formalizzare le cose nel caso di un sistema a componenti.</p> <p>Personalmente mi era sfuggito ma l’autore fa notare come esista almeno un caso di <em>duck typing</em> in C#, attraverso il funzionamento dell’interfaccia <code>IEnumerable</code> e il <a href="http://msdn.microsoft.com/en-us/library/ttw7t8t6(VS.71).aspx">foreach</a>.</p> <p>Ci sono tonnellate di esempi in Python sul funzionamento dei protocolli (dopotutto sono uno dei concetti fondamentali), tipo la determinazione della lunghezza di un contenitore:</p> <pre><code>&gt;&gt;&gt; lst = [1, 2, 3, 4] &gt;&gt;&gt; d = {1: 'a', 'b': 'c'} &gt;&gt;&gt; class Container(object): ... def __len__(self): ... return 3 ... &gt;&gt;&gt; len(lst) 4 &gt;&gt;&gt; len(d) 2 &gt;&gt;&gt; len(Container()) 3 </code></pre> <p>La classe custom <code>Container</code> si adatta al protocollo <code>__len__</code> proprio tramite <em>duck typing</em>.</p> <p>Ad esempio esistono anche <code>__str__</code> (chiamato da <code>str()</code>, <code>%s</code> e <code>print</code>) per la rappresentazione in stringa di un oggetto oppure <code>__nonzero__</code> per determinare il valore booleano di verità di un oggetto.</p> <p>Python supporta anche l’<strong>overloading degli operatori</strong>, implementato anch’esso tramite protocolli:</p> <pre><code>&gt;&gt;&gt; class Three(object): ... def __add__(self, other): ... return other + 3 ... &gt;&gt;&gt; t = Three() &gt;&gt;&gt; t + 2 5 </code></pre> <p><code>__add__</code> è soltanto uno dei tanti metodi speciali per implementare l’overloading, altri sono: <code>__sub__</code>, <code>__div__</code>, <code>__mul__</code>, <code>__or__</code> ecc. ecc.</p> <p>Per restare in tema anche il concetto di iterazione che la generazione sono protocolli. Il <em>generator protocol</em> usa l’espressione <code>yield valore</code> per sospendere l’esecuzione di una funzione, salvarne lo stato e permettere la ripresa dal punto di salvataggio.</p> <p>Grazie alla possibilità di inviare valori o lanciare eccezioni all’interno di un generatore è possibile implementare delle <a href="http://en.wikipedia.org/wiki/Coroutine">coroutine</a> anche in Python. Questo apre la porta a concetti come il <a href="http://en.wikipedia.org/wiki/Green_threads">green threading</a> (thread in user space) o i thread cooperativi senza pre-emption.</p> <p>Sempre grazie al concetto di protocollo è possibile customizzare l’accesso agli attributi di un oggetto usando metodi speciali come <code>__getattr__</code>, <code>__setattr__</code>, <code>__delattr__</code> e le funzioni <code>hasattr()</code>, <code>getattr()</code>, <code>setattr()</code>, <code>delattr()</code>. Tra l’altro gli attributi (metodi compresi) sono memorizzati in un attributo speciale chiamato <code>__dict__</code>.</p> <p>Una volta introdotto e spiegato il concetto di protocollo si passa alla metaprogrammazione avanzando la parola <em>metaclasse</em>.</p> <p>Le metaclasse non sono altro che il tipo delle classi. Le classi in Python sono oggetti normalissimi come gli altri, quindi hanno un tipo, il loro tipo è la loro metaclasse.</p> <p>La metaclasse di default in Python è <code>type</code>:</p> <pre><code>&gt;&gt;&gt; type(type) is type True </code></pre> <p>Usando l’attributo <code>__metaclass__</code> è possibile modificare il comportamento di default:</p> <pre><code>&gt;&gt;&gt; class PointlessMetaclass(type): ... def __new__(meta, name, bases, classDict): ... return type.__new__(meta, name, bases, classDict) ... &gt;&gt;&gt; class SomeClass(object): ... __metaclass__ = PointlessMetaclass </code></pre> <p>Lo scopo delle metaclassi è semplice: introdurre modifiche prima dell’istanziazione di una classe. Non sono tremendamente usate in Python (per fortuna), ma sono utili per registrazioni di classi, creazione di <acronym title="Domain Specific Language">DSL</acronym>, ispezioni di classi, decorazioni, mixin e altro ancora.</p> <p>Il libro a questo punto mostra un estensivo esempio di <em>profiling</em> di una classe attraverso una metaclasse che decora tutti i suoi metodi misurandone il tempo di esecuzione.</p> <p>Dettagli a parte (per cui rimando al libro) il capitolo si conclude con una serie di differenze tra IronPython e la CLR per far capire come si affrontano in IronPython le cose che non hanno un corrispettivo chiaro.</p> <p>Menziona: array .NET, generics, overloading di metodi esplicito, <em>out</em>, <em>ref</em>, <em>params</em>, puntatori, <a href="http://channel9.msdn.com/wiki/ironpython/valuetypes/">value e reference types</a>, chiamata di metodi di una interfaccia, attributi .NET (che non sono supportati direttamente se non tramite classi stub).</p> <p>Conclude mostrando come creare assembly usando la compilazione statica (anche a runtime) attraverso il metodo <code>clr.CompileModules</code>.</p> <p>Il capitolo 8 è la fine della seconda parte del libro. La terza parte si butta sulle parti avanzate di .NET e il loro uso da IronPython (.NET 3, SilverLight, ASP.NET e altro ancora).</p> <img src="http://blogs.ugidotnet.org/lawrence/aggbug/95147.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx Fri, 09 Jan 2009 15:13:12 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/09/ironpython-in-action-protocolli-metaprogrammazione-e-altro.aspx#feedback 1 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95147.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95147.aspx IronPython In Action, testing dinamico ironpython http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx <p>Il capitolo 7 parla sostanzialmente di testing. L’autore, come ho già detto nel <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a> ha contribuito allo sviluppo di una applicazione IronPython che ha circa 40.000 righe e circa 150.000 di test…</p> <p>I post precedenti sono: <a href="http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-proprieta-dialog-e-visual-studio.aspx">proprietà, dialog e Visual Studio</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/30/ironpython-in-action-first-class-functions-e-xml.aspx">first class functions e xml</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-applicazioni-e-design-pattern.aspx">applicazioni e design pattern</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/29/ironpython-in-action-oggetti-.net-e-ironpython.aspx">oggetti .NET e IronPython</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/28/ironpython-in-action-introduzione-a-python.aspx">introduzione a Python</a>, <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/26/ironpython-in-action-introduzione.aspx">introduzione al libro</a> e il <a href="http://blogs.ugidotnet.org/lawrence/archive/2008/12/19/ironpython-in-action-preambolo.aspx">preambolo</a>.</p> <p>Il default nel mondo Python per il testing unitario è il modulo <a href="http://www.python.org/doc/2.5.4/lib/module-unittest.html">unittest</a>, modello sul framework JUnit che tutti conosciamo. Il suo funzionamento in parole povere: il <em>runner</em> identifica i metodi che cominciano con ‘test’, li esegue e si segna i fallimenti e gli errori. Esempio:</p> <pre><code>&gt;&gt;&gt; import unittest &gt;&gt;&gt; class TCase(unittest.TestCase): ... def setUp(self): pass ... def tearDown(self): pass ... def testSomething(self): ... self.assertEquals(2, 2, "two it's not two") ... &gt;&gt;&gt; unittest.main() . ---------------------------------------------------------------------- Ran 1 test in 0.000s OK </code></pre> <p><code>unittest.main()</code> esegue il <em>runner</em>, i metodi <code>setUp</code> e <code>tearDown</code> vengono rispettivamente eseguiti prima e dopo i metodi di test. Si possono avere anche metodi di setup e teardown a livello di modulo volendo. Le asserzioni si verificano con i vari metodi <em>assertXYZ</em>. La linea di comando mostra un punto per i test passati, una ‘F’ per quelli falliti e una ‘E’ per quelli in errore. Ovviamente esiste anche più di una interfaccia grafica per il modulo unittest (più o meno integrate con i vari IDE).</p> <p>Personalmente penso che ci siano framework più comodi e versatili di unittest. Alcuni come <code>nose</code> che sono basati su <em>discovery</em> e una architettura a plugin (facilmente estensibili), altri come <code>py.test</code> che di particolare hanno la possibilità di distribuire i test su N macchine.</p> <p>Infine esistono tool come <code>pyFIT</code> per il fitnesse testing, e altri ancora.</p> <p>A questo punto l’autore introduce l’uso dei <em>mock objects</em> per testare l’applicazione Windows Forms che sta sviluppando nei vari capitoli.</p> <p>Apro una parentesi dicendo che a me è personalmente capitato di dover fare TDD sviluppando una applicazione GUI facendo anche uso di mock objects e devo dire che è davvero interessante. Come mi è anche capitato di usare tool come Selenium per fare test funzionali di applicazioni web. Sono tool che probabilmente poca gente usa ma che meritano un po’ di investimento.</p> <p>Il libro ora comincia a creare un oggetto <em>mock</em> per testare l’applicazione <em>MultiDoc</em> riorganizzando nel frattempo anche il codice in maniera più organica, separando i test dal resto del codice.</p> <p>Tra le molteplici librerie disponibili per Python l’autore sceglie quella che si è scritto da solo (che tra l’altro è anche la più diffusa credo, e quella che vi consiglio nel caso siate interessati): <a href="http://pypi.python.org/pypi/mock/0.4.0">Mock</a>.</p> <p>Un altra caratteristica molto usata nel testing, prerogativa dei linguaggi dinamici, è il <em>monkey patching</em> ovvero la possibilità di patchare a runtime gli oggetti. È talmente importante che personalmente mi ha “salvato il culo” due o tre volte quando ho trovato bug in librerie e non c’era tempo per aspettare la versione successiva.</p> <p>Per comprendere appieno il <em>monkey patching</em> di un metodo in Python bisogna comprendere le regole di lookup di un metodo. In breve: una istruzione come <code>obj.method()</code> cerca il metodo prima nell’istanza, <code>obj</code>, poi nella classe e poi in tutti gli antenati di quella classe. Se si aggiunge un metodo a runtime ad una classe questa modifica è riflessa su tutte le istanze di tale classe, se invece il metodo viene aggiunto ad una singola istanza la modifica non si riflette affatto:</p> <pre><code>&gt;&gt;&gt; class Foo(object): pass ... &gt;&gt;&gt; f = Foo() &gt;&gt;&gt; g = Foo() &gt;&gt;&gt; def method(self): return 'method called' ... &gt;&gt;&gt; Foo.method = method # add a method at runtime &gt;&gt;&gt; f.method() # both the instances have it 'method called' &gt;&gt;&gt; g.method() 'method called' &gt;&gt;&gt; del Foo.method # remove the method at runtime &gt;&gt;&gt; def method2(): return 'method called' ... &gt;&gt;&gt; f.method = method2 # add a method to the instance &gt;&gt;&gt; f.method() # f has it 'method called' &gt;&gt;&gt; g.method() # g doesn't Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; AttributeError: 'Foo' object has no attribute 'method' &gt;&gt;&gt; </code></pre> <p>Notare che <code>method</code> ha <code>self</code> come argomento, mentre <code>method2</code> non ha nessun argomento. Questo perché il lookup in una classe crea un oggetto metodo <em>bound</em> a cui passare <code>self</code>. In una istanza è semplicemente una funzione <em>unbound</em>.</p> <p>Il libro dopo aver introdotto il concetto di monkey patching e le regole di lookup usa il primo concetto per patchare a runtime un metodo facendo in modo che ritorni un oggetto mock invece che l’oggetto reale. Molto semplice, una volta capito cosa c’è dietro. È una pratica molto comune.</p> <p>Dopodiché l’autore introduce la <em>dependency injection</em> per diminuire l’accoppiamento tra il comportamento dei test e quello delle classi.</p> <p>Il capitolo termina con una introduzione al testing funzionale e le <a href="http://www.extremeprogramming.org/rules/userstories.html">user story</a>. Per testare in maniera <em>black box</em> alcune feature dell’applicazione, come la creazione di un nuovo tab per una pagina, usa il multithreading e <code>Invoke</code> per creare un mini framework per inviare pressioni di tasti, movimenti di mouse e pressione di bottoni all’applicazione da testare.</p> <img src="http://blogs.ugidotnet.org/lawrence/aggbug/95091.aspx" width="1" height="1" /> Lawrence Oluyede http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx Sun, 04 Jan 2009 22:54:25 GMT http://blogs.ugidotnet.org/lawrence/archive/2009/01/04/ironpython-in-action-testing-dinamico.aspx#feedback 1 http://blogs.ugidotnet.org/lawrence/comments/commentRss/95091.aspx http://blogs.ugidotnet.org/lawrence/services/trackbacks/95091.aspx