如何用Python从字符串定义函数

12 投票
4 回答
19491 浏览
提问于 2025-04-16 17:10

这是我的代码:

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

fun()

但是它显示错误:

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

那我该怎么办呢,

谢谢

4 个回答

2

在使用 eval 的时候,非表达式的参数必须先用 compile 编译一下;因为 str 只会被当作表达式来处理,所以完整的语句和任意代码都需要先用 compile 编译。

如果你把它和 compile 混合使用,就可以用 eval 来执行任意代码,比如:

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

上面的代码在 Python 2 和 Python 3 中都能正常工作,效果是一样的,这和 exec 不同(在 Python 2 中是一个关键字,而在 Python 3 中是一个函数)。

3

Eval 只会计算表达式,而 exec 则是执行语句。

所以你可以尝试这样的代码:

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

fun()
17

eval() 函数只能用来处理表达式,也就是说,它只能计算一些简单的值。如果你想执行更复杂的语句,应该使用 exec

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

不过在你这样做之前,先想想你真的需要动态代码吗?其实大多数情况下,你并不需要这样做。

撰写回答