【发布时间】:2014-02-16 05:39:41
【问题描述】:
我遇到了一个有趣的挑战
重点:
我希望允许用户在文本字段中输入表达式,并将该字符串视为 python 表达式。我想为这个表达式提供一些局部变量。
我确实有一个解决方案,但实施起来会很麻烦。我正在考虑保留一个 Python 类源文件,其中包含一个包含单个 %s 的函数。当用户输入他的表达式时,我们简单地做一个字符串格式,然后调用 Jython 的解释器,吐出一些我们可以执行的东西。在该表达式前面必须有许多变量声明语句,以确保我们想要向用户公开的变量用于他的表达式。
所以用户会看到一个文本字段,他会输入
x1 + (3.5*x2) ** x3
然后我们会做我们的解释过程来提出一个开放的委托对象。然后,我们将值从映射中打入该对象,并调用执行,以获取表达式的结果。
对使用 Jython 有任何反对意见,或者我应该做些什么而不是修改源代码?我想认为某种类似于 C# 的 Expression 对象的可变对象,我们可以在其中执行类似的操作
PythonExpression expr = new PythonExpression(userSuppliedText)
expr.setDefaultNamespace();
expr.loadLibraries("numPy", /*other libraries?*/);
//comes from somewhere else in the flow, but effectively we get
Map<String, Double> symbolValuesByName = new HashMap<>(){{
put("x1", 3.0);
put("x2", 20.0);
put("x3", 2.0);
}};
expr.loadSymbols(symbolValuesByName);
Runnable exprDelegate = expr.compile();
//sometime later
exprDelegate.run();
但是,我希望很多,而且看起来 Jython 已经做到了最好。尽管如此,修改源文件然后将它们传递给解释器似乎真的很重。
这听起来是个好方法吗?你们还有其他推荐的库吗?
更新:NumPy 不适用于 Jython
我应该自己发现这个的。
所以现在我的问题转移了:有什么方法可以从单个 JVM 进程实例(意思是,无需分叉)编译和运行一些 Python 代码?
【问题讨论】:
-
你需要支持像
next(x**2 for x in {2, 3})这样的实际Python表达式,还是类似Python的表达式? -
为什么是 Python 表达式?表达式中需要支持哪些具体内容?
-
需要python的权力。我建议使用 matlab 或 mathmatica,但我们想要 python。 Blender:不。如果我可以访问解析树(或 AST),我想对表达式执行“断言返回类型为双精度”,但我现在可以完全忽略错误检查。跨度>
-
python 的具体内容是什么?我想我毕竟可以从 python 语法中的 'expr' 产生:docs.python.org/2/reference/grammar.html
-
你需要 NumPy 吗?如果您建议的替代品是 Matlab 和 Mathematica,听起来您很有可能需要 NumPy,而且我认为它不能与 Jython 互操作。
标签: java python parsing compiler-construction jvm