还有types.FunctionType
,你可以用它来动态地创建的功能,例如@H_419_3@
def test_func(): print 'wow'
dynf = types.FunctionType(test_func.func_code, {})
dynf()
wow
您可能会反对这不是动态的,因为我正在使用另一个函数的代码,但这仅是示例,这里有一种从python字符串生成代码的方法,例如@H_419_3@
dynf = types.FunctionType(compile('print "really WoW"', 'dyn.py', 'exec'), {})
dynf()
really WoW
现在,这是动态的!@H_419_3@
OP担心此类功能的动态性,因此这是另一个示例@H_419_3@
dynf = types.FunctionType(compile('test_func():\ntest_func()', 'dyn.py', 'exec'), globals())
dynf()
wow
wow
注意:像这样创建Function对象似乎有局限性,例如,传递参数并不容易,因为要传递参数,我们需要将正确的co_argcount,co_varnames和其他12个变量传递给types.CodeType
,理论上可以做到,但是容易出错,更简单的方法是将字符串作为模块导入,并且您具有完整的功能,例如@H_419_3@
import types
import sys,imp
code = """def f(a,b,c):
print a+b+c, "really WoW"
"""
module = imp.new_module('myfunctions')
exec code in module.__dict__
module.f('W', 'o', 'W')
WoW really WoW