17

我想使用 eval 定义一个 Python 函数:

func_obj = eval('def foo(a, b):  return a + b')

但它返回无效的语法错误?我怎样才能做到?

顺便说一句,如何在 Python 中将函数 obj 转换为字符串对象?

4

4 回答 4

19

使用exec. eval用于表达式而不是语句。

>>> exec 'def foo(a, b):  return a + b'
>>> foo(1, 2)
3

来自函数对象的函数代码:

def func():
    """ I'm func """
    return "Hello, World"
... 
>>> import inspect
>>> print inspect.getsource(func)
def func():
    """ I'm func """
    return "Hello, World"
于 2013-11-02T12:58:46.640 回答
6

您可以使用evalwith lambda,例如:

func_obj = lambda a, b: eval('a + b')
于 2013-11-02T13:25:27.147 回答
2
def test_eval():
    exec('def foo(a, b):  return a + b')   
    foo(1, 2)

@niitsuma 此代码将返回错误:NameError: name 'foo' is not defined

这是因为 foo 是在您执行它的其他范围内定义的。要修复它并使其在外部范围内可见,您可以使 foo 全局变量:

def test_eval():
    exec('global foo\ndef foo(a, b):  return a + b')   
    foo(1, 2)
于 2020-02-24T12:11:04.060 回答
0

我写

def test_eval():
    exec('def foo(a, b):  return a + b')   
    foo(1, 2)

mypackage/tests/test_mycode.py适当的mypackage/setup.py。但是python setup.py test导致 NameError: name 'foo' is not defined.

如何测试字符串中的代码?

于 2020-02-24T11:58:50.483 回答