将raw_input转换为python表达式

时间:2012-12-07 00:04:46

标签: python input typeerror

首先,我正在使用线性编程包PuLP

好的,我正在使用

通过shell收集用户输入
x = raw_input('-->')

现在用户将要输入的信息是线性不等式形式(例如2 * a + 3 * b <= 4)。我已经编写了一个方法,将用户定义的变量a和b存储到LP中。

我现在无法通过以下方式获取输入并将其存储为LP中的约束:

prob += x 

如果您对python文件中的信息进行硬编码,则只需添加:

prob += 2*a +3*b <= 4

这个例子

我得到的错误信息是:

  

TypeError:+ =的不支持的操作数类型:&#39; int&#39;和&#39; str&#39;

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

尝试做:

x = float(raw_input('-->'))

我假设prob是一个整数。 raw_input以字符串形式返回变量,因此您希望将其转换为整数/浮点数。你得到错误,因为你试图“添加”一个字符串和一个整数;要么添加两个整数,要么连接两个字符串,但它们不能相互完成。因此,由于x必须是整数(或浮点数),使用float(obj)int(obj) ---你不知道x是浮点数还是整数,所以只需使用float

要解析给出的不等式,请执行以下操作:

#assuming no spaces in the inequality are included; if the input isn't in the correct form, the program will NOT work correctly
ineq = input("What is the inequality? Input in the form: ax+by<=c: ")
a, b, c, sign, index = 0, 0, 0, '', 0 #multiple assignment
while ineq[index] != 'x': #until it reaches x, it will keep going
   a += int(ineq[index])
   if ineq[index] == 'x':
      break
   index += 1  # index = index + 1

index += 2 #to go through the 'x' and '+'

while ineq[index] != 'y':
   b += int(ineq[index])
   if ineq[index] == 'y':
      break
   index += 1

index += 1 #to go through the 'y'

if ineq[index] == '<' and ineq[index + 1] == '=':
   sign = '<='
elif ineq[index] == '>' and ineq[iddex + 1] == '=':
   sign = '>='
elif ineq[index] == '>':
   sign = '>'
else:
   sign = '<'

if sign == '<=' or sign == '>=':
   index += 2 #to go through the '>' or '<' and the '='
else:
   index += 1 #to go through the '>' or '<'

c = int(ineq[index:])
#code to solve the inequality

更简单快捷的方法是只提示用户输入'a','b','c'和'sign'的每个值。

答案 1 :(得分:2)

因此,您的用户输入和代码内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脚本,那么编写解析器是浪费您的时间和精力 - 您不会执行你自己的盒子上的恶意代码。