Everyone knows Anders announced at
PDC08 that C#
4.0
will include new features (aka the dynamic keyword + the DLR) that makes
it much easier for C# to call into dynamically typed code. What you
probably don’t know is that IronPython 2.6 includes a new feature that
makes it easier for IronPython code to be called by statically typed
code.
While the vast majority of .NET is available to IronPython, there are
certain APIs that just don’t work with dynamic code. In particular, any
code that uses Reflection over an object’s CLR type metadata won’t work
with IronPython. For example, while WPF
supportsICustomTypeDescriptor,
Silverlight only supports data binding against reflectable properties.
Furthermore, any code that uses custom attributes inherently uses
Reflection. For example, Darrel Hawley recently blogged a WCF host he
wrote in
IronPython,
but he wrote the WCF service in C#. You can’t write WCF services in
IronPython because WCF expects service classes to be
adorned with
ServiceContract
and
OperationContract
attributes (among many others). IronPython users want access to use
these APIs. Support for custom attributes is one of the most common
requests
we get – it’s currently the 5th highest vote getter among open
issues.
In IronPython 2.6, we’re adding the ability to customize the CLR type of
Python classes. This means you can add custom attributes, emit
properties, whatever you want. For those of you who’ve been dreaming of
implementing WCF services or databinding in Silverlight purely in
IronPython, then this is the feature for you.
In a nutshell, IronPython 2.6 extends Python’s
metaclass
feature that lets you to customize the creation of classes. In the
metaclass, you can implement an IronPython-specific method
__clrtype__ which returns a custom
System.Type of
your own creation that IronPython will then use as the underlying CLR
type of the Python class. Implementing __clrtype__ gives you the
chance to implement whatever reflectable metadata you need:
constructors, fields, properties, methods, events, custom attributes,
nested classes, whatever.
Over a series of posts, I’ll be demonstrating this new feature and
implement some common scenario requests – including Silverlight
databinding and WCF services – purely in Python. Quick warning:
__clrtype__ uses low level features like Python metaclasses,
Reflection.Emit
and DLR
Binders
so these posts will be deeper technically than usual. Don’t worry – this
isn’t the API interface we expect everyone to use. Eventually, we want
to have an easy to use API that will sit on top of the low-level
__clrtype__ hook.