1

先週末、私は 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 で達成できますか? 試してみましたが、うまくいきませんでした...

4

2 に答える 2

2

compile() を使用すると、作成されたコード オブジェクトとその名前とソースを制御できますが、exec はそれほど柔軟ではありません。他の人があなたのコードを読んだときに、それらが別々のステップであることを知り、後で同じコードを複数回実行する必要があるときにこれを念頭に置くようにすることも価値があります( compile() が1回、複数回実行される場合コードを書いて次に読む人を教育することは、常にデザインの選択に価値のある影響を与えます。

于 2009-05-25T19:37:26.480 に答える
2

私が見るいくつかの違いがあります。まず、compileは、構文エラーに直面した場合のセマンティクスが よりわずかに優れていますexeccompile本当の理由は、 の定義が改行文字の処理に関して非常に明示的であることが原因であると思われexecます。

内部関数の代わりに、なぜcompile、どこで使用されているのか興味がありました。exec知りませんでしたcompile/exec利用可能なグローバルを制御できます。とても興味深い。

于 2009-05-25T15:19:16.277 に答える