这个python代码不是求解方程

时间:2016-10-07 03:17:29

标签: python bots irc instant-messaging payload

我有一个即时通讯工具的聊天机器人,我正在尝试为它做一个数学解算器,但是它不能将等式的解决方案发送到Instant Messenger,它会发送等式。

如果有来自Instant Messenger的人发送“解决: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

2 个答案:

答案 0 :(得分:1)

您的测试代码

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)),而表达式为#34; 2 + 2 * 3"变成像Addition(Const(2), Multiplication(Const(2), Const(3)))这样的东西然后你需要评估它应该相当简单。

我建议pyparsing为您提供帮助。

答案 1 :(得分:0)

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

但是,如果您只是提供eval件事,用户输入就会很危险。 Security of Python's eval() on untrusted strings?

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

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