exec
如果您准备生成抽象语法树 (AST)并编译它们,则可以避免生成 then源代码。它可能会稍微好一些,因为数据可以一直保持结构化。
from ast import *
from types import *
function_ast = FunctionDef(
name='f',
args=arguments(args=[], vararg=None, kwarg=None, defaults=[]),
body=[Return(value=Num(n=42, lineno=1, col_offset=0), lineno=1, col_offset=0)],
decorator_list=[],
lineno=1,
col_offset=0
)
module_ast = Module(body=[function_ast])
module_code = compile(module_ast, "<not_a_file>", "exec")
function_code = [c for c in module_code.co_consts if isinstance(c, CodeType)][0]
f = FunctionType(function_code, {})
print f()
上面的代码将打印42
.
要获得有关生成的 AST 应该是什么的灵感,您可以使用:
print(dump(parse("def f(): return 42"), include_attributes=True))
当然,AST 在 Python 2 和 Python 3 中是不同的。
编辑:
在 Python 3.8 中测试和工作
from ast import *
from types import *
function_ast = FunctionDef(
name='f',
args=arguments(
args=[], vararg=None, kwarg=None, defaults=[],
kwonlyargs=[], kw_defaults=[], posonlyargs=[]
),
body=[Return(value=Num(n=42, lineno=1, col_offset=0), lineno=1, col_offset=0)],
decorator_list=[],
lineno=1,
col_offset=0
)
module_ast = Module(body=[function_ast], type_ignores=[])
module_code = compile(module_ast, "<not_a_file>", "exec")
function_code = [c for c in module_code.co_consts if isinstance(c, CodeType)][0]
f = FunctionType(function_code, {})
print(f())