Python: необходимо заменить ряд различных подстрок в шаблоне HTML на дополнительные результаты HTML или базы данных - PullRequest
1 голос
/ 28 января 2010

Положение:

Я пишу базовую систему шаблонов на языке Python / mod_python, которая читает основной HTML-шаблон и заменяет экземпляры «: value:» по всему документу дополнительными результатами HTML или БД, а затем возвращает их в виде представления пользователю.

Я не пытаюсь заменить все экземпляры 1 подстроки. Значения могут варьироваться. Существует ограниченный список того, что приемлемо. Это не безгранично. Синтаксис для значений: [двоеточие] значение [двоеточие]. Примеры могут быть ": gallery:,: related:,: comments:". Замена может быть дополнительным статическим HTML или вызовом функции. Функции также могут различаться.

Вопрос:

Какой самый эффективный способ чтения в основном файле HTML и замены неизвестной комбинации значений соответствующей заменой?


Заранее спасибо за любые мысли / решения,

с

Ответы [ 3 ]

4 голосов
/ 28 января 2010

Существуют десятки вариантов шаблонов, которые уже существуют. Рассмотрим гэнши , мако , jinja2 , шаблоны django или более

Вы обнаружите, что заново изобретаете колесо без особой пользы.

1 голос
/ 28 января 2010

Это, вероятно, работа для шаблонизатора, а для Python есть ряд вариантов .В этом вопросе stackoveflow люди перечислили свои фавориты, а некоторые услужливо объясняют почему: Какой ваш любимый движок шаблонов Python?

1 голос
/ 28 января 2010

Если по какой-либо причине вы не можете использовать существующую систему шаблонов, ваша проблема лучше всего решается с помощью регулярных выражений:

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)

Как правило, вам потребуются два словаря (один сопоставляет значения с соответствующими значениями, другой сопоставляет значения с соответствующими вызываемыми функциями) и функцию, вызываемую в качестве последней попытки для значений, которые невозможно найти ни в одном из них толковый словарь; Приведенный выше код показывает вам, как соединить эти вещи (я использую замыкание, класс, конечно, будет так же хорошо) и как применить их для требуемой задачи замены.

...