how to define a function from a string using python

Eval evalutes only expressions, while exec executes statements.

So you try something like this

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

fun()

Non-expression eval arguments must be compile-ed first; a str is only processed as an expression, so full statements and arbitrary code require compile.

If you mix it with compile, you can eval arbitrary code, e.g.:

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

The above works fine and works identically on Python 2 and Python 3, unlike exec (which is a keyword in Py2, and a function in Py3).


If your logic is very simple (i.e., one line), you could eval a lambda expression:

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

As others have mentioned, it is probably best to avoid eval if you can.


eval() with a string argument is only for expressions. If you want to execute statements, use exec:

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

But before you do that, think about whether you really need dynamic code or not. By far most things can be done without.