Невыражение eval
аргументы должны быть compile
-ed сначала; str
обрабатывается только как выражение, поэтому для полных операторов и произвольного кода требуется compile
.
Если вы смешаете его с compile
, вы можете eval
произвольный код, например ::
eval(compile('''def fun():
print 'bbb'
''', '<string>', 'exec'))
Вышеописанное прекрасно работает и работает одинаково на Python 2 и Python 3, в отличие от exec
(который является ключевым словом в Py2 и функцией в Py3).