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 とやり取りする部分をもうちょっと美しくすれば、十分にノリとして使えそうです。