eval() 的限制?

-3 投票
4 回答
3200 浏览
提问于 2025-04-17 15:24

这是为什么呢?

>>> 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 个回答

1

你还可以:

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

试试用 compile

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

是的,你可以通过字典来发送 eval 变量,作为第二个(和第三个)参数。这些参数的详细说明可以在这里找到。下面是你的例子:

>>> 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)

撰写回答