是否可以从Python脚本向宿主应用返回对象或值?
比如在Lua语言中,你可以在脚本的最后加上一行代码:
return <some-value/object>
这样返回的值或对象就可以被运行这个脚本的应用程序获取。
我使用这种方式是为了让脚本可以作为事件处理器的工厂。基于脚本的事件处理器可以用来扩展应用程序。举个例子,运行的应用程序会执行一个叫做'SomeEventHandler.lua'的脚本,这个脚本定义并返回一个对象,这个对象就是你应用程序中'SomeEvent'的事件处理器。
那么在Python中可以做到这一点吗?或者有没有更好的方法来实现这个功能?
更具体一点,我在我的C#应用程序中嵌入了IronPython,想找一种方法来实例化这些基于脚本的事件处理器,这样就可以用Python来扩展应用程序。
4 个回答
2
在Python中也可以这样做。你可以要求插件提供一个叫做getHandler()的函数,这个函数会返回事件处理器:
class myPlugin(object):
def doIt(self,event,*args):
print "Doing important stuff"
def getHandler(self,document):
print "Initializing plugin"
self._doc = document
return doIt
当用户说“我现在想用插件X”时,你就知道该调用哪个函数。如果这个插件不仅仅是在用户直接命令后调用,还需要在某些事件发生时调用(比如加载一个图形元素时),你也可以给插件的作者提供一些方法,让他们把处理器绑定到这个特定的事件上。
2
可以在这个链接里看到一些例子:嵌入动态语言运行时。
这里有一个简单的例子,关于设置和获取变量:
SourceCodeKind st = SourceCodeKind.Statements;
string source = "print 'Hello World'";
script = eng.CreateScriptSourceFromString(source, st);
scope = eng.CreateScope();
script.Execute(scope);
// The namespace holds the variables that the code creates in the process of executing it.
int value = 3;
scope.SetVariable("name", value);
script.Execute(scope);
int result = scope.GetVariable<int>("name");