почему моя функция "eval" не работает - PullRequest
0 голосов
/ 24 декабря 2009
a='''b="ddd"'''
eval(repr(a))
print str(a)
print b

Пожалуйста, попробуйте использовать код, а не текст, потому что мой английский не очень хорош, спасибо

Ответы [ 3 ]

3 голосов
/ 24 декабря 2009

Использование:

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

2 голосов
/ 24 декабря 2009

eval используется для оценки (получения результата) выражения. Вам нужно динамическое выполнение кода Python, которое выполняется с exec :

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

Также обратите внимание, что вы не должны вызывать repr () перед передачей строки в любую функцию. У вас уже есть строка, вызов repr () создает строковое представление строки.

0 голосов
/ 24 декабря 2009

Пересмотрите, действительно ли вам нужно использовать eval(). Например, вы можете использовать globals() следующим образом:

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

Но, возможно, вам следует использовать словарь :

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