1

状況:

メインの HTML テンプレートを読み取り、ドキュメント全体の ":value:" のインスタンスを追加の HTML または db の結果に置き換えてから、ビューとしてユーザーに返す基本的なテンプレート システムを Python/mod_python で作成しています。

1 つの部分文字列のすべてのインスタンスを置き換えようとしているわけではありません。値は異なる場合があります。許容できるものには有限のリストがあります。無制限ではありません。値の構文は [コロン]値[コロン] です。例としては、「:gallery: , :related: , :comments:」などがあります。置換は、追加の静的 HTML または関数の呼び出しである場合があります。機能も異なる場合があります。

質問:

メインの HTML ファイルを読み取り、未知の値の組み合わせを適切な置換に置き換える最も効率的な方法は何ですか?


ご意見/解決策をお寄せいただきありがとうございます。

c

4

3 に答える 3

4

すでに多数のテンプレート オプションが存在します。genshimakojinja2django templatesなどを検討してください。

車輪を再発明していて、ほとんどまたはまったくメリットがないことに気付くでしょう。

于 2010-01-28T16:30:14.190 に答える
1

これはおそらくテンプレート エンジンの仕事であり、Python には多くの選択肢があります。このstackoveflowの質問では、人々はお気に入りをリストアップし、その理由を有益に説明しています:あなたの唯一のお気に入りのPythonテンプレートエンジンは何ですか?

于 2010-01-28T17:36:06.970 に答える
1

何らかの理由で既存のテンプレート システムを使用できない場合は、正規表現を使用して問題を解決するのが最善のようです。

import re

valre = re.compile(r':\w+:')

def dosub(correspvals, correspfuns, lastditch):
  def f(value):
    v = value.group()[1:-1]
    if v in correspvals:
      return correspvals[v]
    if v in correspfuns:
      return correspfuns[v]()  # or whatever args you need
    # what if a value has neither a corresponding value to
    # substitute, NOR a function to call?  Whatever...:
    return lastditch(v)
  return f

replacer = dosub(adict, another, somefun)

thehtml = valre.sub(replacer, thehtml)

基本的に、2 つの辞書 (値を対応する値にマッピングするもの、呼び出される対応する関数に値をマッピングするもの) と、どちらの辞書にも見つからない値の最後の試みとして呼び出される関数が必要です。上記のコードは、これらをまとめる方法 (私はクロージャを使用していますが、もちろんクラスも同様です) と、必要な置換タスクにそれらを適用する方法を示しています。

于 2010-01-28T16:36:07.140 に答える