因此,您的用户输入与您的代码内 python 示例之间存在根本区别:
在此示例中,用户输入将是字符串文字"2*a + 3*b <=4"
您无法将字符串文字附加到prob
,因为它需要一个约束或类似的对象——这就是您的错误的来源。
prob += x
当您在 python 中评估相同的表达式时,您会注意到它缺少我在上面的语句周围有用地放置的引号。
这不是字符串文字,而是 python 表达式。纸浆的某些部分将其评估为约束对象,然后将该约束添加到问题中。
prob += 2*a +3*b <= 4
现在,完全忽略任意代码执行的可能性,解决问题的最简单方法是将用户输入评估为 python 代码,然后让语言完成其余的工作:
exec("prob +="+x);
需要注意的是,除非此脚本完全供您个人使用,否则这是一个糟糕的主意。
从一般编程的角度来看,正确的解决方案是从字符串构造一个 LPConstraint 对象,然后将新构造的对象添加到 prob.
在理想的世界中,您将有一个用于 LPConstraint 的构造函数,该构造函数接受一个字符串,或者在库中的某个地方为您执行此操作的辅助方法。
我已经完成了(诚然所有 5 分钟......)一些阅读文档,但找不到任何这样的方法。假设没有其他人运气好,那么您就只能自己解析字符串(以及随之而来的所有麻烦)并根据结果构建约束对象。
对于这样的问题,问题实际上是范围之一:
- 你在哪里安装这个脚本?
- 谁将使用它?
- 他们能造成什么潜在的损害?
如果您正在创建要在高中或大学的计算机实验室中运行的 python 脚本,看在上帝的份上,请不要使用 exec。
如果您出于自己的目的创建 Python 脚本以在您(也可能是您朋友的)机器上运行,那么编写解析器是公然浪费您的时间和精力——您不会执行恶意代码你自己的盒子。