cómo definir una función desde una cadena usando python

este es mi codigo

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

pero muestra error:

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

entonces Que puedo hacer ,

Gracias

eval() con un argumento de cadena es solo para expresiones. Si quieres ejecutar sentencias, usa exec :

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

Pero antes de hacerlo, piense si realmente necesita un código dynamic o no. Con mucho, la mayoría de las cosas se pueden hacer sin.

Eval evalúa solo expresiones, mientras que exec ejecuta sentencias.

Así que intentas algo como esto

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

Los argumentos eval no expresión se deben compile primero; una str solo se procesa como una expresión, por lo que las declaraciones completas y el código arbitrario requieren compile .

Si lo mezcla con compile , puede eval código arbitrario, por ejemplo:

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

Lo anterior funciona bien y funciona de manera idéntica en Python 2 y Python 3, a diferencia de exec (que es una palabra clave en Py2 y una función en Py3).

Si su lógica es muy simple (es decir, una línea), podría evaluar una expresión lambda :

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

Como han mencionado otros, probablemente es mejor evitar la eval si puedes.