使用 Jython 将全局函数委托给 Java
Delegating global functions to Java with Jython
我想将我在 Java 中实现的函数绑定到 Jython 解释器实例的全局范围内(因此我不需要先在我的脚本中手动导入它们)。
如果这有帮助,我正在寻找与 Groovy's DelegatingScript 类似的东西,您可以在其中将脚本主体的委托设置为 Java/Groovy 对象,因此可以直接调用对象函数在 DSL 脚本中。
有什么办法可以实现吗?
原来这很容易做到。
您可以将静态函数放入 Dsl class,这些函数可以在脚本中直接调用。
注意:这与 Groovy 的作用不完全相同,因为您将局部作用域绑定到对象而不是 class,但有些人认为这仍然非常有用.
App.java
public final class App {
public static void main(String[] args) throws Exception {
try (PythonInterpreter py = new PythonInterpreter()) {
py.exec("from hu.company.jythontest.Dsl import *");
try (FileInputStream script = new FileInputStream("./etc/test.py")) {
py.execfile(script);
}
var blocks = py.get("blocks", List.class);
System.out.println(blocks.toString());
}
}
}
Dsl.java
public final class Dsl {
public static class Block {
private final String id;
public Block(String id) {
this.id = id;
}
public String getId() {
return id;
}
@Override
public String toString() {
return id;
}
}
}
test.py
blocks = [Block('%d' % i) for i in range(10)]
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我想将我在 Java 中实现的函数绑定到 Jython 解释器实例的全局范围内(因此我不需要先在我的脚本中手动导入它们)。
如果这有帮助,我正在寻找与 Groovy's DelegatingScript 类似的东西,您可以在其中将脚本主体的委托设置为 Java/Groovy 对象,因此可以直接调用对象函数在 DSL 脚本中。
有什么办法可以实现吗?
原来这很容易做到。 您可以将静态函数放入 Dsl class,这些函数可以在脚本中直接调用。
注意:这与 Groovy 的作用不完全相同,因为您将局部作用域绑定到对象而不是 class,但有些人认为这仍然非常有用.
App.java
public final class App {
public static void main(String[] args) throws Exception {
try (PythonInterpreter py = new PythonInterpreter()) {
py.exec("from hu.company.jythontest.Dsl import *");
try (FileInputStream script = new FileInputStream("./etc/test.py")) {
py.execfile(script);
}
var blocks = py.get("blocks", List.class);
System.out.println(blocks.toString());
}
}
}
Dsl.java
public final class Dsl {
public static class Block {
private final String id;
public Block(String id) {
this.id = id;
}
public String getId() {
return id;
}
@Override
public String toString() {
return id;
}
}
}
test.py
blocks = [Block('%d' % i) for i in range(10)]
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]