Обработка ошибок при импорте модулей

Класс Java, который может оценивать математические выражения:

package test;

public class Calculator {

    public static Double calculate(String expression){
        if (expression == null || expression.length() == 0) {
            return null;
        }
        return calc(expression.replace(" ", ""));
    }
    public static Double calc(String expression) {

        if (expression.startsWith("(") && expression.endsWith(")")) {
            return calc(expression.substring(1, expression.length() - 1));
        }
        String[] containerArr = new String[]{expression};
        double leftVal = getNextOperand(containerArr);
        expression = containerArr[0];
        if (expression.length() == 0) {
            return leftVal;
        }
        char operator = expression.charAt(0);
        expression = expression.substring(1);

        while (operator == '*' || operator == '/') {
            containerArr[0] = expression;
            double rightVal = getNextOperand(containerArr);
            expression = containerArr[0];
            if (operator == '*') {
                leftVal = leftVal * rightVal;
            } else {
                leftVal = leftVal / rightVal;
            }
            if (expression.length() > 0) {
                operator = expression.charAt(0);
                expression = expression.substring(1);
            } else {
                return leftVal;
            }
        }
        if (operator == '+') {
            return leftVal + calc(expression);
        } else {
            return leftVal - calc(expression);
        }

    }

    private static double getNextOperand(String[] exp){
        double res;
        if (exp[0].startsWith("(")) {
            int open = 1;
            int i = 1;
            while (open != 0) {
                if (exp[0].charAt(i) == '(') {
                    open++;
                } else if (exp[0].charAt(i) == ')') {
                    open--;
                }
                i++;
            }
            res = calc(exp[0].substring(1, i - 1));
            exp[0] = exp[0].substring(i);
        } else {
            int i = 1;
            if (exp[0].charAt(0) == '-') {
                i++;
            }
            while (exp[0].length() > i && isNumber((int) exp[0].charAt(i))) {
                i++;
            }
            res = Double.parseDouble(exp[0].substring(0, i));
            exp[0] = exp[0].substring(i);
        }
        return res;
    }


    private static boolean isNumber(int c) {
        int zero = (int) '0';
        int nine = (int) '9';
        return (c >= zero && c <= nine) || c =='.';
    }

    public static void main(String[] args) {
        System.out.println(calculate("(((( -6 )))) * 9 * -1"));
        System.out.println(calc("(-5.2+-5*-5*((5/4+2)))"));

    }

}
30
задан serv-inc 29 June 2017 в 15:07
поделиться

2 ответа

Я не думаю, что блок try except является непитоническим; вместо этого это обычный способ обработки импорта в Python.

Цитирую Dive into Python:

Есть много других применений для исключений, кроме обработки фактических условия ошибок. Обычное использование в стандартной библиотеке Python - это попытка импортировать модуль, а затем проверить сработало ли это. Импортирование модуля который не существует, вызовет ImportError. Вы можете использовать это для определения нескольких уровней функциональности на основе того, какие модули доступны во время выполнения, или для поддержки нескольких платформ (когда код, специфичный для платформы, разделяется в разные модули).

Следующий пример демонстрирует, как использовать исключение для поддержки функциональности, специфичной для конкретной платформы.

try:
    import termios, TERMIOS                     
except ImportError:
    try:
        import msvcrt                           
    except ImportError:
        try:
            from EasyDialogs import AskPassword 
        except ImportError:
            getpass = default_getpass           
        else:                                   
            getpass = AskPassword
    else:
        getpass = win_getpass
else:
    getpass = unix_getpass
48
ответ дан 27 November 2019 в 05:58
поделиться

Самый простой способ - убедиться, что все модули могут быть загружены во всех системах. Если это не сработает, включение каждого оператора import в блок try является следующим лучшим решением и совсем не является не-Pythonic.

4
ответ дан 27 November 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: