2009-12-24 10 views

Répondre

3

utilisation:

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

au lieu de:

eval(repr(a)) 

Transcription:

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

Le problème est que vous exécutez réellement l'instruction 'b="ddd"' qui n'est pas une affectation à b mais une évaluation de la chaîne.

Le eval() intégré, lorsqu'il reçoit une chaîne, l'évalue en tant qu'expression (pas une instruction) et renvoie le résultat. Vous pouvez obtenir eval() pour exécuter le code de non-expression en lui donnant un objet de code, que nous créons avec compile() ci-dessus. Dans ce cas, il exécute le code et renvoie None.

Vous pouvez voir un effet similaire si vous entrez simplement:

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

Il est clair que 7=d n'est pas valide Python, mais '7=d' est, pour la raison expliquée ci-dessus.

Descriptions des expr(), repr() et compile() Encastrements, assez suffisantes pour nous en sortir, ont été trouvés here. Aucun built-ins ont été blessés pendant la réalisation de cette réponse.

+0

voir aussi: http://docs.python.org /reference/simple_stmts.html#exec – Miles

2

eval est utilisé pour évaluer (obtenir le résultat de) une expression. Ce que vous voulez est l'exécution dynamique du code Python, qui est fait avec exec:

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

Notez également que vous ne devez pas appeler rééd() avant de passer la chaîne à deux fonctions. Vous avez déjà une chaîne, appeler repr() crée une représentation sous forme de chaîne d'une chaîne.

0

Réexaminez si vous devez vraiment utiliser eval(). Par exemple, vous pouvez utiliser globals() comme ceci:

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

Mais peut-être ce que vous devriez probablement utiliser est juste un dictionary:

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