Как определить функцию из строки с помощью Python - PullRequest
8 голосов
/ 07 мая 2011

это мой код:

a = \
'''def fun():\n
    print 'bbb'
'''
eval(a)

fun()

но он показывает ошибку:

Traceback (most recent call last):
  File "c.py", line 8, in <module>
    eval(a)
  File "<string>", line 1
    def fun():
      ^
SyntaxError: invalid syntax

так что я могу сделать,

спасибо

Ответы [ 4 ]

13 голосов
/ 07 мая 2011

eval() со строковым аргументом только для выражений.Если вы хотите выполнить операторы, используйте exec:

exec """def fun():
  print 'bbb'
"""

Но прежде чем сделать это, подумайте, действительно ли вам нужен динамический код или нет.Безусловно, большинство вещей можно обойтись без.

3 голосов
/ 07 мая 2011

Eval вычисляет только выражения, в то время как exec выполняет операторы.

Итак, вы пытаетесь что-то вроде этого

a = \
'''def fun():\n
    print 'bbb'
'''
exec a

fun()
2 голосов
/ 27 февраля 2016

Невыражение eval аргументы должны быть compile -ed сначала; str обрабатывается только как выражение, поэтому для полных операторов и произвольного кода требуется compile.

Если вы смешаете его с compile, вы можете eval произвольный код, например ::

eval(compile('''def fun():
    print 'bbb'
''', '<string>', 'exec'))

Вышеописанное прекрасно работает и работает одинаково на Python 2 и Python 3, в отличие от exec (который является ключевым словом в Py2 и функцией в Py3).

1 голос
/ 26 февраля 2016

Если ваша логика очень проста (то есть, одна строка), вы можете вычислить выражение lambda:

a = eval("lambda x: print('hello {0}'.format(x))")
a("world") # prints "hello world"

Как уже упоминалось, вероятно, лучше избегать eval, если можете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...