eval()的限制?

2024-10-01 13:39:34 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么会这样?在

>>> 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()变量?在

^{pr2}$

我应该更精确地说,我想一旦我得到一个好的答案,它将是普遍的。但是,这是我尝试@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的实现。在


Tags: 答案evalstdinline用例建议filesyntax
3条回答

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

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

顺便说一句,您得到的具体错误并不是因为eval不能将赋值变量的语句作为它的第一个参数(尽管它确实不能);而是因为str的参数需要是一个表达式,它不能赋值变量,而不是一个可以赋值的语句。请注意,str也会出现相同的错误:

^{2}$

编辑:对于您的特定用例,您遇到的问题是输入字符串

 '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使用星号语法自动将元组解压为一个函数的连续参数,即将y=eval(z)替换为

y = eval(*z)

您还可以:

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

尝试使用compile

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

相关问题 更多 >