Если предварительно скомпилированное свойство является свойством, которое рассчитывается и кэшируется при первом доступе; Я хотел бы сделать то же самое, но вместо этого взять несколько списков и собрать их в один основной список.
Для небольшой предыстории я сейчас создаю сайт 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 вещи:
- Способ обернуть объединенный список в свойство класса
- Способ сделать свойство кэшируемым (желательно в качестве декоратора)
С чем я не хочу иметь дело, так это с дополнительными издержками, возникающими при составлении списка при каждом вызове.
Я читал и использовал декоратор кэшированных свойств, но мне не совсем понятно, как они работают и / или могут ли они быть легко адаптированы для работы со списками.
Примечание. Несмотря на то, что этот пример вымышлен, этот пример предназначен для упрощения работы. Долгосрочная цель здесь - предоставить 2 разных набора маршрутов в зависимости от конфигурации приложения.