Создание кэшированного свойства, которое хранит / возвращает объединение списков - PullRequest
0 голосов
/ 29 февраля 2012

Если предварительно скомпилированное свойство является свойством, которое рассчитывается и кэшируется при первом доступе; Я хотел бы сделать то же самое, но вместо этого взять несколько списков и собрать их в один основной список.

Для небольшой предыстории я сейчас создаю сайт GAE / python / webapp2 / jinja2. Не обращая внимания на мелочи, мой список маршрутов становится довольно большим. В настоящее время у меня есть статические маршруты, динамические маршруты и перенаправления, объединенные в один список.

Пример:

master = [
  Route('/',StaticHandler, defaults={'_uri':'index.html'}),
  Route('/about-us', StaticHandler, defaults={'_uri':'index.html'})
  Route('/secure/', AuthHandler, defaults={'_uri':'secure.html'}),
  Route('/secure/<_uri>', AuthHandler, defaults={'_uri':'not-found.html'})
  Route('/about.html', RedirectHandler, defaults={'_uri':'about-us'})]

Для простоты я бы хотел сгруппировать их следующим образом:

main = [
  Route('/',StaticHandler, defaults={'_uri':'index.html'}),
  Route('/about-us', StaticHandler, defaults={'_uri':'index.html'})]

auth = [
  Route('/secure/', AuthHandler, defaults={'_uri':'secure.html'}),
  Route('/secure/<_uri>', AuthHandler, defaults={'_uri':'not-found.html'})]

redirect = [
  Route('/about.html', RedirectHandler, defaults={'_uri':'about-us'})]

В настоящее время я использую:

master = main + auth + redirects

Что работает, но я думаю, что мне нужно обернуть это в свойство класса, чтобы сделать его кешируемым.

Пока я пробовал:

class master(object):
  def __init__(self):
    self.list = list(set(main) & set(auth) & set(redirects))
  def __iter__(self):
    return iter(self.list)

Но я получаю сообщение об ошибке: «TypeError: объект« type »не повторяется».

Так что мне нужно 2 вещи:

  1. Способ обернуть объединенный список в свойство класса
  2. Способ сделать свойство кэшируемым (желательно в качестве декоратора)

С чем я не хочу иметь дело, так это с дополнительными издержками, возникающими при составлении списка при каждом вызове.

Я читал и использовал декоратор кэшированных свойств, но мне не совсем понятно, как они работают и / или могут ли они быть легко адаптированы для работы со списками.

Примечание. Несмотря на то, что этот пример вымышлен, этот пример предназначен для упрощения работы. Долгосрочная цель здесь - предоставить 2 разных набора маршрутов в зависимости от конфигурации приложения.

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Я прошу прощения, если я вас неправильно понял, но ... это будет в основном то, что вы хотите? ..

a = [1,2,3]
b = [4,5,6]
c = [7,8,9]

class master(object):
    routes = a+b+c

if __name__ == '__main__':
    m = master()
    print m.routes

Урожайность:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Но, что более важно ..

a = master()
b = master()

b.routes.append(100)

print b.routes
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 100]

print a.routes
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 100]
1 голос
/ 29 февраля 2012

Ваше исходное предположение, что список маршрутов рассчитывается по каждому запросу, неверно. Они определены на уровне модуля, поэтому будут рассчитываться при первом импорте, то есть при запуске каждого экземпляра. Предварительная компиляция или запоминание сделают точно так же.

...