Этот код Python не решает уравнения

У меня есть чат-бот для мессенджера, и я пытаюсь сделать для него математический решатель, но он не может отправить решение уравнения в мессенджер, вместо этого он отправляет уравнение.

Если кто-то из мессенджера отправляет «решить: 2+2», эта программа должна отправить ему «4», а не «2+2».

Основная проблема:

if (parser.getPayload().lower()[:6]=="solve:"):
                    parser.sendGroupMessage(parser.getTargetID(), str(parser.getPayload()[7:]))

вывод:

он снова отправляет тот же ввод, а не ответ уравнения

Тест. Я протестировал что-то, и оно работает правильно. Если я добавлю этот код, программа отправит решение уравнения:

if (parser.getPayload().lower()=="test"):
                    parser.sendGroupMessage(parser.getTargetID(), str(2 + 2 -3 + 8 * 7))

Вывод: работает отлично


person Bharat    schedule 07.10.2016    source источник
comment
Попробуйте использовать оператор eval в python. eval("2+2") даст вам 4.   -  person Preston Hager    schedule 07.10.2016
comment
@PrestonHager eval крайне обескуражен. ast.literal_eval лучше   -  person Andrew Li    schedule 07.10.2016
comment
Да, модуль ast выглядит хорошо. Вместо этого попробуйте ast.literal_eval("2+2"). Не забудьте импортировать ast, import ast.   -  person Preston Hager    schedule 07.10.2016
comment
эм, джентльмены, вы учите его, как оценивать случайный код, который он получает из чата? @Bharat, обратите внимание, что люди будут присылать вам что угодно, то есть вместо 2+2 они сохранят решение ‹за которым следует код для удаления всех ваших файлов›   -  person MK.    schedule 07.10.2016
comment
Это решено. Спасибо @PrestonHager, Эндрю Л. и MK.   -  person Bharat    schedule 07.10.2016


Ответы (2)


Что вам нужно сделать, чтобы вычислить математические выражения в строковой форме.

Однако пользовательский ввод опасен, если вы всего лишь eval вещи, которые они вам дают. Безопасность Python eval() для ненадежных строк?

Вы можете использовать ast.literal_eval, чтобы снизить риск.

Или вы можете использовать оценщик из ответов на следующий вопрос Оценка математического выражения в строке

person Ivan    schedule 07.10.2016

Ваш тестовый код

str(2 + 2 -3 + 8 * 7)

отличается от вашего производственного кода

str(parser.getPayload()[7:])

который расширяется в

str("2 + 2 -3 + 8 * 7")

предполагая, что вы проходите в той же цитате. Хорошо, что у вас работает сантехника, теперь вам нужно реализовать настоящий математический решатель, например

str(solve_math(parser.getPayload()[7:]))

def solve_math(expr : str) -> float:
    """
    Parses and evaluates math expression `expr` and returns its result.
    """

Здесь вам нужно сначала разобрать строку выражения в некоторую структуру, представляющую данные, операторы/функции и порядок оценки. Таким образом, ваше выражение «2 + 2» превращается во что-то вроде Addition(Const(2), Const(2)), а выражение «2 + 2 * 3» превращается во что-то вроде Addition(Const(2), Multiplication(Const(2), Const(3))), а затем вам нужно просто оценить его, что должно быть довольно просто.

Я рекомендую pyparsing, чтобы помочь вам с этим.

person Jan Matějka    schedule 07.10.2016
comment
Спасибо, что объяснили все. - person Bharat; 07.10.2016