Оказалось, это довольно легко сделать. Вы можете поместить функции stati c в класс Dsl, и они могут быть напрямую вызваны внутри скрипта.
Примечание: это не совсем то, что делает Groovy, потому что там вы привязываете локальную область видимости к объект, а не класс, но с некоторым размышлением это все еще может быть очень полезным.
Приложение. 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]