我试图覆盖IronPython提供的默认__import__方法来处理数据库导入。我已经完成了这里提供的示例:https://stackoverflow.com/a/4127766/862319
到目前为止,一切正常,但CLR类型中的命名空间解析存在一个小问题。我可以使用语法import ClrAssembly.Type
导入,但语法from ClrAssembly import Type
不起作用。这是一个小小的不便,但我想解决它。我怀疑是有两个方法签名绑定到IronPython中的__import__方法:
但是,上面的SO链接只会导致使用5参数签名的单个方法。这是设置后的__import__变量:
我如何构建映射到2个方法签名的自定义IronPython.Runtime.Types.BuiltinFunction
(5个param和2个param版本的DoDatabaseImport)并将其分配回__import__变量?
答案 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));
}