eval()的局限性?

时间:2013-02-10 11:31:58

标签: python eval

这是为什么?

>>> eval(str(17*3))
51
>>> t=17;t*3
51
>>> eval(str(t=17;t*3))
  File "<stdin>", line 1
    eval(str(t=17;t*3))
                 ^
SyntaxError: invalid syntax
>>> 

有没有办法发送eval()变量?

>>> z=input("ins: ");cxc=compile(z,'<string>','exec');y=eval(cxc);print(y)
ins: t=17;t+3
None
>>> 

我本来应该更准确,我想如果我得到一个好的答案,那将是普遍的。但是,这是我尝试@cnicutar建议的实际用例。

>>> z=input("ins: ");y=eval(z);print(y)
ins: 't*13+q', {'q':4,'t':2}
('t*13+q', {'q': 4, 't': 2})
>>> 

尝试@LtWorf和@ Ghopper21的实施。

4 个答案:

答案 0 :(得分:2)

尝试使用compile

>>> expr = compile('t = 42; print(t)', '<string>', 'exec')
>>> eval(expr)
42

答案 1 :(得分:2)

是的,您可以使用字典作为第二个(和第三个)参数发送eval个变量。这些参数记录在案here。这是你的例子:

>>> eval('t*3', {'t': 17})
51

顺便说一下,你得到的具体错误并不是因为eval不能将语句赋值变量作为第一个参数(尽管实际上它不能);这是因为str的参数需要是一个表达式,它不能分配变量,而不是语句。请注意,只有str

会出现同样的错误
>>> str(t=17;t*3)
  File "<stdin>", line 1
    str(t=17;t*3)
        ^
SyntaxError: invalid syntax

编辑:至于您的具体用例,您遇到的问题是输入字符串

 't*13+q', {'q':4,'t':2}

被评估(通过input,它读入一个字符串并在其上调用eval)到一个所谓的“元组”,即多个表达式组合成一个表达式,由于逗号的存在。你无法评估一个元组。 (您的用例示例实际上应该返回错误 - 不确定为什么不是。)

要解决此问题,您需要“解包”元组,以便eval知道元组的哪个部分是您要评估的表达式(第一部分,字符串表达式为t*13+q,即z[0])和变量值的字典(第二部分,字典{'q':4,'t':2},即z[1]),即用

替换y=eval(z)
y = eval(z[0], z[1])

或者(以及更多Python),您可以告诉Python使用星号语法自动将元组解压缩到函数的连续参数中,即用

替换y=eval(z)
y = eval(*z)

答案 2 :(得分:1)

你也可以:

>>> t = 17
>>> print eval('t*3')
51

答案 3 :(得分:0)

eval(source[, globals[, locals]]) -> value

您还可以传递包含{'a'= 0,'b'= 1}之类的字典等等...

例如:

eval('t*13+q', {'q':4,'t':2})