先週末、私は Michele Simionato のdecorator moduleをばらばらにして、署名を保存するデコレーターを構築しました。すべての中心には、動的に生成された関数があり、これに似た動作をします...
src = """def function(a,b,c) :\n return _caller_(a,b,c)\n"""
evaldict = {'_caller_' : _caller_}
code = compile(src, '<string>', 'single')
exec code in evaldict
new_func = evaldict[function]
このコードをいじってみると、コンパイル手順を完全に回避して単一の手順を実行できることがわかりました。
exec src in evaldict
さて、その追加のステップには正当な理由があると確信していますが、両方のアプローチの違いを見つけることができませんでした. パフォーマンス?
そして、私が尋ねているので、同様のこと、つまり新しい関数を定義してそのハンドルを取得することは、eval で達成できますか? 試してみましたが、うまくいきませんでした...