IronPythonで式評価 その4

akirameiさんからご指摘頂いたので、再度IronPythonEvaluatorクラスを修正した。

public IronPythonEvaluator()
{
    EngineOptions engineOptions = new EngineOptions();
    engineOptions.ShowClrExceptions = true;
    this.engine = new PythonEngine(engineOptions);
    this.engine.Import("System");
}
public object Evaluate(string exp, IDictionary ctx, object root)
{
    this.engine.Globals["root"] = root;
    this.engine.Globals["exp"] = exp;
    /*this.engine.Execute("import System");*/
    return this.engine.Evaluate("eval(exp)", this.engine.DefaultModule, ctx);
}

前回のエントリで、System名前空間をインポートする動作をPythonEngine::Executeメソッドで行っていたのだが、今回のコンストラクタのように事前にインポートすることが可能なようだ。
なお、指摘のあったEvaluateメソッドに渡す評価式に"eval"は不要だとのことなので、なるほど確かにそうだと思って外したのだが、そうするとパラメタ"exp"に"System.DateTime.Now"を渡すと、そのまま文字列として評価されてしまう。

/* "System.DateTime.Now"が注入されてしまう */
return this.engine.Evaluate("exp", this.engine.DefaultModule, ctx);

以下のように定数を渡すと、期待通り式が評価されるので、変数を渡す場合はevalは必要のようだ。

/* 期待通り、現在の日付+時間が注入される */
return this.engine.Evaluate("System.DateTime.Now", this.engine.DefaultModule, ctx);

私もakirameiさんの指摘は最もだと思ったので釈然としないが、変数を渡した場合は変数を文字列に評価した段階でEvaluateは完結しているのだろう。