抽象構文木 (AST)を生成して代わりにコンパイルするexec
準備ができている場合は、ソース コードを生成してから ing することを避けることができます。データはずっと構造化されたままでいられるので、少し良いかもしれません。
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))
もちろん、Python 2 と Python 3 では AST が異なります。
編集:
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())