-4

为什么是这样?

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

4 回答 4

2

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

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

顺便说一句,您得到的具体错误不是因为eval不能将语句分配变量作为它的第一个参数(尽管它确实不能);这是因为参数 tostr需要是表达式,不能赋值变量,而不是语句,可以。请注意,您将得到相同的错误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+qie 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)
于 2013-02-10T12:13:39.207 回答
2

尝试使用compile

>>> expr = compile('t = 42; print(t)', '<string>', 'exec')
>>> eval(expr)
42
于 2013-02-10T11:36:15.213 回答
1

你也可以:

>>> t = 17
>>> print eval('t*3')
51
于 2013-02-10T11:38:28.337 回答
0
eval(source[, globals[, locals]]) -> value

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

例如:

eval('t*13+q', {'q':4,'t':2})
于 2013-02-10T12:12:36.323 回答