gpt4 book ai didi

java - 自动处理/忽略 Jython 中的 NameError

转载 作者:行者123 更新时间:2023-12-01 17:01:52 24 4
gpt4 key购买 nike

我有一个设置,可以从 Java 应用程序执行 jython 脚本。 java 应用程序向 jython 脚本提供来自命令行的变量,以便用户可以在其 jython 脚本中编写以下代码:

print("Hello, %s" % foobar)

并将用以下方式调用java程序:

$ java -jar myengine.jar script.py --foobar=baz
Hello, baz

我的 java 应用程序解析命令行,并使用给定值创建该名称的变量,以提供给 jython 脚本环境使用。到目前为止一切都很好。

我的问题是,当用户不提供 foobar 命令行参数时,我希望能够轻松地在我的脚本中提供后备。目前,用户需要编写此类代码来处理命令行中缺少 foobar 参数的情况:

try: foobar
except NameError: foobar = "some default value"

但这很麻烦,尤其是当参数数量不断增加时。 从脚本用户的角度来看,有没有办法更好地处理这个问题?

我正在考虑捕获Java代码中的jython NameError,如果导致异常的变量“看起来像”一个参数(添加命名约定就可以了),则将导致异常的变量初始化为默认值,然后重新启动发生异常。或者,我可以要求脚本用户编写如下代码:

parameter(foobar, "some default value")

或者类似的东西。

最佳答案

嗯,这是我迄今为止发现的一个丑陋的解决方法。 要小心,因为这会多次循环调用脚本,并且时间复杂度为 O(n^2)。

private void callScriptLoop(String scriptfile) {
PythonInterpreter pi = new PythonInterpreter();
pi.set("env", someEnv);
int nloop = 0;
boolean shouldRestart;
do {
shouldRestart = false;
try {
pi.execfile(scriptfile);
} catch (Throwable e) {
if (e instanceof PyException) {
PyException pe = (PyException) e;
String typ = pe.type.toString();
String val = pe.value.toString();
Matcher m = Pattern.compile("^name '(.*)' is not defined")
.matcher(val);
if (typ.equals("<type 'exceptions.NameError'>")
&& m.find()) {
String varname = m.group(1);
pi.set(varname, Py.None);
System.out.println(
"Initializing missing parameter '"
+ varname + "' to default value (None).");
shouldRestart = true;
nloop++;
if (nloop > 100)
throw new RuntimeException(
"NameError handler infinite loop detected: bailing-out.");
}
}
if (!shouldRestart)
throw e;
}
} while (shouldRestart);
}

关于java - 自动处理/忽略 Jython 中的 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61501196/

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