此 python 代码不是求解方程式

This python code is not solving equations

我有一个即时通讯聊天机器人,我正在尝试为它制作一个数学求解器,但它无法将方程的解发送给即时通讯,而是发送方程。

如果有人从 Instant Messenger 发送 "solve: 2+2",这个程序应该发送给他们“4”而不是“2+2”。

主要问题:

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

输出:

it's sending same input again not the answer of equation

测试: 我测试了一些东西并且工作正常。如果我添加这段代码,程序将发送方程的解:

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

输出: Working perfectly

你需要做什么来评估字符串形式的数学表达式。

但是,如果您只是 eval 用户提供的任何东西,那么用户输入是危险的。 Security of Python's eval() on untrusted strings?

您可以使用 ast.literal_eval 来降低风险。

或者您可以使用来自以下问题答案的评估器 Evaluating a mathematical expression in a string

你的测试代码

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 来帮助你。