IronPython覆盖内置方法

时间:2015-08-09 16:34:10

标签: c# ironpython

我试图覆盖IronPython提供的默认__import__方法来处理数据库导入。我已经完成了这里提供的示例:https://stackoverflow.com/a/4127766/862319

到目前为止,一切正常,但CLR类型中的命名空间解析存在一个小问题。我可以使用语法import ClrAssembly.Type导入,但语法from ClrAssembly import Type不起作用。这是一个小小的不便,但我想解决它。我怀疑是有两个方法签名绑定到IronPython中的__import__方法:

Screenshot of import variable

但是,上面的SO链接只会导致使用5参数签名的单个方法。这是设置后的__import__变量:

enter image description here

我如何构建映射到2个方法签名的自定义IronPython.Runtime.Types.BuiltinFunction(5个param和2个param版本的DoDatabaseImport)并将其分配回__import__变量?

1 个答案:

答案 0 :(得分:2)

希望这个答案可以帮助那些正在研究这个老问题的人。

查看IronPython 2.7.7的源代码,特别是来自的builtin.cs文件  https://github.com/IronLanguages/main/blob/3d9c336e1b6f0a86914a89ece171a22f48b0cc6e/Languages/IronPython/IronPython/Modules/Builtin.cs

你可以看到2参数函数用默认值调用5参数重载。

public static object __import__(CodeContext/*!*/ context, string name) {
    return __import__(context, name, null, null, null, -1);
}

为了复制这个,我使用了一个具有类似默认值的委托。

delegate object ImportDelegate(CodeContext context, string moduleName, object globals = null, object locals = null, object fromlist = null, int level = -1);

protected object ImportOverride(CodeContext context, string moduleName, object globals = null, object locals = null, object fromlist = null, int level = -1)
{
    // do custom import logic here

    return IronPython.Modules.Builtin.__import__(context, moduleName, globals, locals, fromlist, level);
}

覆盖内置导入功能如下所示

private ScriptEngine pyengine;
private ScriptingEngine()
{
    Dictionary<string, object> options = new Dictionary<string, object>();
    options["Debug"] = true;
    pyengine = Python.CreateEngine(options);
    var builtinscope = Python.GetBuiltinModule(pyengine);
    builtinscope.SetVariable("__import__", new ImportDelegate(ImportOverride));
}