gpt4 book ai didi

c# - 调用 IronPython 函数时 CodeContext 的相关性

转载 作者:太空狗 更新时间:2023-10-29 23:51:05 25 4
gpt4 key购买 nike

我正在从 C# 调用 IronPython 函数。似乎在定义上,这个函数捕获了它的原始范围。当我稍后在没有显式范围的情况下调用它时,它仍然可以访问原始范围中的值。即使我更改范围值,它也会正确读取新值。看看这个例子:

using IronPython.Hosting;
using IronPython.Runtime;
using IronPython.Runtime.Operations;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;

namespace IronPythonFuncTest {
class Program {
static void Main() {
ScriptEngine scriptEngine = Python.CreateEngine();

// Create scope with a global value for the script to use
ScriptScope scriptScope = scriptEngine.CreateScope();
scriptScope.SetVariable("someGlobalValue", 10);

// Execute script defining function foo(x)
string script = "def foo(): print(someGlobalValue)";
ScriptSource scriptSource = scriptEngine.
CreateScriptSourceFromString(script, SourceCodeKind.Statements);
scriptSource.Execute(scriptScope);

// Extract foo from the scope
PythonFunction foo = scriptScope.GetVariable<PythonFunction>("foo");

// Change someGlobalValue
scriptScope.SetVariable("someGlobalValue", 42);

// Call foo. This prints 42, not 10 (or nothing).
PythonCalls.Call(foo);
}
}
}

现在我想知道:PythonCalls.Call() 的大多数重载都需要一个 CodeContext 对象(如果我理解正确的话,它主要代表一个范围)。如果我像上面那样调用 IronPython 函数而不传递代码上下文,我会丢失一些东西吗?鉴于该函数显然在创建时捕获了其原始范围,因此传递额外的代码上下文似乎没有任何意义。在某些情况下,我是否这样做会有所不同?

最佳答案

为什么调用 foo 而不是 PythonCall.Call?尝试这样做:scriptScope.Host.ScriptEngine.Operations.InvokeMember(CLASS-Instance, METHOD-Name, ARGUMENTS); 比 Ironpython 将正确处理 CodeContext它自己的。您可以在此处找到示例实现:DlrClass/InvokeMember .

据我所知,CodeContext不仅仅是作用域,看看定义就知道了:

/// <summary>
/// Captures and flows the state of executing code from the generated
/// Python code into the IronPython runtime.
/// </summary>
[DebuggerTypeProxy(typeof(CodeContext.DebugProxy)), DebuggerDisplay("module: {ModuleName}", Type="module")]
public sealed class CodeContext { // ... }

希望这对您有所帮助!

关于c# - 调用 IronPython 函数时 CodeContext 的相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24284872/

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