Автоматическая обработка / игнорирование NameError в Jython - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть установка, в которой я выполняю сценарии jython из приложения Java. Приложение java передает сценарий jython переменными, приходящими из командной строки, чтобы пользователь мог написать следующий код в своем сценарии jython:

print("Hello, %s" % foobar)

и вызовет программу java с this:

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

Мое приложение java анализирует командную строку и создает переменную с таким именем с заданным значением, которое необходимо передать среде сценариев jython для использования. Пока все хорошо.

Моя проблема в том, что, когда пользователь не предоставляет параметр командной строки foobar, я хотел бы иметь возможность легко предоставить запасной вариант в моем сценарии. На данный момент пользователю необходимо написать код такого рода, чтобы справиться с ситуацией, когда в командной строке отсутствует параметр foobar:

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

Но это громоздко, особенно если количество параметров растет. Есть ли способ справиться с этим лучше с точки зрения пользователя сценария?

Я думал о том, чтобы перехватить jython NameError в коде Java, инициализируя переменную, вызывающую исключение для значение по умолчанию, если переменная, вызывающая исключение, «выглядит как» параметр (добавление соглашения об именах - ОК) и перезапуск в случае возникновения исключения. В качестве альтернативы я могу потребовать от пользователя сценария написать такой код:

parameter(foobar, "some default value")

или что-то эквивалентное.

1 Ответ

0 голосов
/ 29 апреля 2020

Ну, это один уродливый обходной путь, который я нашел до сих пор. Будьте осторожны , так как это будет многократно вызывать скрипт в l oop и равно 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);
}
...