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.
voir aussi: http://docs.python.org /reference/simple_stmts.html#exec – Miles