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, IDictionaryctx, 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は完結しているのだろう。