2009-12-24 70 views

回答

3

用途:

eval(compile(a,'<string>','exec')) 

代替:

eval(repr(a)) 

成绩单:

>>> a='''b="ddd"''' 
>>> eval(compile(a,'<string>','exec')) 
>>> print str(a) 
b="ddd" 
>>> print b 
ddd 

问题是,您实际上正在执行语句'b="ddd"',该语句不是b的赋值,而是字符串的评估。

eval()内置的,当给定一个字符串时,将其评估为表达式(不是语句)并返回结果。您可以通过为其提供一个代码对象来运行非表达式代码eval(),我们使用上面的compile()创建代码对象。在这种情况下,它将运行代码并返回None

你可以看到一个类似的效果,如果你只需要输入:

>>> 'c=7' 
'c=7' 
>>> c 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'c' is not defined 
>>> c=7 
>>> c 
7 
>>> '7=d' 
'7=d' 
>>> 7=d 
    File "<stdin>", line 1 
SyntaxError: can't assign to literal 

显然7=d不是有效的Python,但'7=d'是,由于以上原因解释。

expr()repr()compile()内置插件的描述,足以足以工作了这一点,发现here。在做出这个答案的过程中,没有任何内建损害。

+0

参见:http://docs.python.org /reference/simple_stmts.html#exec – Miles 2009-12-24 07:40:52

2

eval用于评估(得到结果)表达式。你想要的是一个Python代码,这是与exec进行动态执行:

>>> a='''b="ddd"''' 
>>> exec(a) 
>>> print b 
ddd 

还要注意的是,你不应该叫再版()的字符串传递给任何函数之前。你已经有一个字符串,调用repr()创建一个字符串的字符串表示形式。

0

重新考虑您是否确实需要使用eval()。例如,你可以使用globals()这样的:

>>> globals()['b'] = 'ddd' 
>>> print b 
ddd 

但是,也许你应该使用什么只是一个dictionary

>>> my_namespace = dict() 
>>> my_namespace['b'] = 'ddd' 
>>> my_namespace 
{'b': 'ddd'} 
>>> print my_namespace['b'] 
ddd