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 :-)