简体   繁体   中英

how to define a function from a string using python

this is my code :

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

fun()

but it shows error :

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

so what can i do ,

thanks

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.

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, eg:

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 (ie, 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM