gpt4 book ai didi

c# - IronPython 覆盖内置方法

转载 作者:行者123 更新时间:2023-11-30 16:53:01 25 4
gpt4 key购买 nike

我正在尝试覆盖 IronPython 提供的默认 __import__ 方法来处理数据库导入。我已经运行了此处提供的示例:https://stackoverflow.com/a/4127766/862319

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

Screenshot of import variable

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

enter image description here

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

最佳答案

希望这个答案能帮助正在看这个老问题的人。

查看 IronPython 2.7.7 的源代码,特别是来自 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)。

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));
}

关于c# - IronPython 覆盖内置方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31906387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com