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.