IronPython を定義ファイル代わりに
定義ファイルってのは最近は大抵 XML で書きます。XML は確かに DOM や SAX などの API を使えば読み込みやすいのですが、実際に記述するのは冗長かつ面倒くさいです。さらに読み取って実際のオブジェクトにマッピングするには文字列からの型変換が必要なのでこれまた面倒くさい。
こういうのが嫌で、以前に C# や VB.NET のコードを実行時に動的にコンパイルして使えるようにした事もありました。しかし、これはこれでコードが長いし小難しい。ちょっとした定義にしてはたいそう過ぎました。
で、目をつけたのが最近流行の IronPython 。若干、出遅れ気味ですがお仕事で使えそうなところを発見したので調べてみました。
定義したい値を保持するためのクラスは以下のような感じ。なぜか VB 。
Namespace IronPythonTest Public Enum Rank High Middle Low End Enum Public Class User Private id_ As Integer Public Property Id() As Integer Get Return id_ End Get Set(ByVal value As Integer) id_ = value End Set End Property Private name_ As String Public Property Name() As String Get Return name_ End Get Set(ByVal value As String) name_ = value End Set End Property Private rank_ As Rank Public Property Rank() As Rank Get Return rank_ End Get Set(ByVal value As Rank) rank_ = value End Set End Property End Class End Namespace
定義ファイル代わりの IronPython のコードは以下のような感じ。これを、user.py という名前で置いておく。
user.Id = 1000 user.Name = "jon" user.Rank = Rank.High
検証するためのコードは以下。やっぱり VB 。
<Test()> _ Public Sub pyファイルが実行されて値が設定されているべき() Dim engine As New PythonEngine() Dim jon As New User() engine.Globals.Item("user") = jon engine.LoadAssembly(Assembly.GetExecutingAssembly) engine.Import("IronPythonTest.Rank") engine.ExecuteFile("user.py") Assert.AreEqual(1000, jon.Id) Assert.AreEqual("jon", jon.Name) Assert.AreEqual(Rank.High, jon.Rank) End Sub
IronPython とやり取りする部分をもうちょっと美しくすれば、十分にノリとして使えそうです。