开发者

how to define a function from a string using python

开发者 https://www.devze.com 2023-03-03 19:38 出处:网络
this is my code : a = \\ \'\'\'def fun():\\n print \'bbb\' \'\'\' eval(a) fun() but it shows error : Traceback (most recent call last):

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开发者_如何学C "<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, 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.

0

精彩评论

暂无评论...
验证码 换一张
取 消