这是为什么?
>>> 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的实施。
答案 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})