我可以使用';评估';在Python中定义函数?

我可以使用';评估';在Python中定义函数?,python,python-2.7,eval,Python,Python 2.7,Eval,我想使用eval定义一个Python函数: func_obj = eval('def foo(a, b): return a + b') 但它返回无效的语法错误? 我怎样才能做到 顺便说一句,在Python中如何将函数obj转换为字符串对象?使用execeval用于表达式而不是语句 >>> exec 'def foo(a, b): return a + b' >>> foo(1, 2) 3 来自函数对象的函数代码: def func(): ""

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

func_obj = eval('def foo(a, b):  return a + b')
但它返回无效的语法错误? 我怎样才能做到


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

使用
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"

您可以将
eval
lambda
一起使用,如:

func_obj = lambda a, b: eval('a + b')
我写

def test_eval():
exec('def foo(a,b):返回a+b')
傅(1,2)
mypackage/tests/test\u mycode.py
中使用适当的
mypackage/setup.py
。 但是
python setup.py test
cause
name错误:未定义名称“foo”

如何从字符串测试代码

def test_eval():
    exec('def foo(a, b):  return a + b')   
    foo(1, 2)
@niitsuma此代码将返回错误:
name错误:未定义名称“foo”

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

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

为什么需要eval()?这是否回答了您的问题?如何将函数对象转换为字符串?@xunzhang只有在函数被定义在某个地方时才有可能,请使用
inspect.getsource
。请看这个问题(),这是我真正需要的~@xunzhang请一次只问一个问题。由于您的答案不包括为什么这是一个坏主意,不应该这样做,所以在OPs的情况下,正如他之前的评论所提到的,他可能只需要
getattr
def(a,b)=return eval('a+b')
也这样做。