Использование:
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()
, достаточных для этого, были найдены здесь . При создании этого ответа никакие встроенные модули не пострадали.