Python eval()的局限性?

Python eval()的局限性?,python,eval,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 >>> 正在尝试@LtWorf和@Ghopper21的实现。尝试使用compil

为什么会这样

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

正在尝试@LtWorf和@Ghopper21的实现。

尝试使用
compile

>>> expr = compile('t = 42; print(t)', '<string>', 'exec')
>>> eval(expr)
42
expr=compile('t=42;print(t)','exec') >>>评估(expr) 42 您还可以:

>>> t = 17
>>> print eval('t*3')
51
您还可以传递包含{'a'=0,'b'=1}等内容的字典

例如:

eval('t*13+q', {'q':4,'t':2})
>>> eval('t*3', {'t': 17})
51

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

eval('t*13+q', {'q':4,'t':2})
>>> 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
将计算结果(通过
input
,读取字符串并对其调用
eval
)计算成所谓的“元组”,即由于逗号的存在,将多个表达式组合成一个表达式。不能计算元组。(您的用例示例实际上应该返回一个错误——不确定为什么不返回。)

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

y = eval(z[0], z[1])
y = eval(*z)
或者(更通俗地说),您可以告诉Python使用星号语法将元组自动解包为函数的连续参数,即用替换
y=eval(z)

y = eval(z[0], z[1])
y = eval(*z)

答案当然是42D> >>z=输入(“ins:”);cxc=compile(z,,'exec');y=评估(cxc);print(y)ins:17+55我一直认为亚当斯会解释在第一次计算中有一个bug。第二次,他们意识到是17岁,道格拉斯·亚当斯解释过。当深入思考给出生命、宇宙和万物的答案时,它注意到在计算过程中存在溢出错误。当亚瑟通过随机挑选拼字游戏来提出这个问题(后来在广播剧中有8集在网上免费提供!)时,问题是“六乘八等于多少”。还要注意str(17*3)是'51',而不是'17*3'。您可能想将字符串文本传递给eval.>>>z=input(“ins:”);y=评估值(x);print(y)ins:'t*3',{'t':17}回溯(上次调用):File“”,第1行,在TypeError:eval()arg 1中必须是字符串、字节或代码对象>>>@Peregrine--请参见针对您的用例的带有答案的编辑。很抱歉,您是否介意给出一个示例。如果您展示了一个与您的通用描述相符的示例,我会更好地理解。编辑以添加示例谢谢,但我在我的问题中添加了我的实际用例,这种语法在这些情况下会失败。。。也就是说,x=输入(“ins:”);eval(x)>>>ins:'t*13+q',{'q':4,'t':2})在不能分配变量的表达式中,只能传递一个以变量作为第二个参数的字典。