0

私は小さなテンプレート エンジンをハッキングしています。私は、動的に生成されたコードの文字列を生成するクラス (テンプレート コンパイラーという名前) を持っています。

例えば ​​:

def dynamic_function(arg):
  #statement
  return rendered_template

レンダリング時に、カスタムグローバルディクショナリを使用して、このコードに対して組み込み関数execを呼び出します(潜在的な悪意のあるユーザーによってテンプレートに挿入されたコードを可能な限り制御するため)。

ただし、コンパイルされたテンプレートをキャッシュして、実行ごとにコンパイルしないようにする必要があります。文字列をプレーンテキストとして保存し、毎回ロードするか、コンパイルを使用して code_object を生成し、そのオブジェクトを保存する (たとえば、 shelve モジュールを使用する) 方が良いのだろうかと思います。

最終的には、テンプレート エンジンをスレッド セーフにしたいと考えています。

読んでくれてありがとう!トーマス

編集:S.Lottが下線を引いているので、それ自体には意味がありません。つまり、より速く、より少ないメモリを消費し、よりシンプルで簡単にデバッグできるということです。もちろん、無料のコーヒーがもっとおいしければもっと良かったのですが。

4

3 に答える 3

2

これらのテンプレートをどこに保存するかについては言及していませんが、それらを「永続的に」保持する場合、Python はメジャー バージョン間のバイトコードの互換性を保証しないことに注意してください。そのため、互換性を保証する方法 (ソース コードの保存など) を選択するか、コンパイル済みのテンプレートが無効な場合に破棄できるように、コンパイル済みのテンプレートと一緒に十分な情報を保存してください。

同じことが marshal モジュールにも当てはまります。たとえば、Python 2.5 でマーシャリングされた値は、Python 2.6 で読み取り可能であるとは約束されていません。

于 2009-08-18T10:42:21.570 に答える
1

個人的には、テキストを保存します。エディターなどでテキストを表示できるため、デバッグやいじりが簡単になります。また、キャッシュ ファイルの内容が期待どおりであることをテストしたい場合は、単体テストを作成するのも非常に簡単です。

後で、システムの速度が不十分であることが判明した場合やプロファイリングでキャッシュされたテンプレートの解析に時間がかかっていることが判明した場合は、バイトコードの保存に切り替えてみることができますが、それはそのときだけです。ストレージ メカニズムが適切にカプセル化されている限り、この変更はかなり簡単です。

于 2009-08-18T11:07:18.883 に答える
0

Mako テンプレート ライブラリは、コンパイルされたテンプレートを Python モジュールとしてキャッシュし、組み込みモジュールを使用してimpバイトコードのキャッシュとコードの読み込みを処理します。これは、インタープリターの変更に対してかなり堅牢で、高速で簡単にデバッグできるようです (生成されたコードのソースをキャッシュで表示できます)。

これを処理する方法については、 mako.templateモジュールを参照してください 。

于 2009-08-18T10:22:21.237 に答える