创建存储/返回列表连接的缓存属性

时间:2012-02-29 11:47:16

标签: python google-app-engine memoization iterable webapp2

如果预编译属性是在第一次访问时计算和缓存的属性;我想做同样的事情,而是采取多个列表并将它们编译成一个主列表。

对于一些背景知识,我目前正在构建一个站点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'对象不可迭代”。

所以我需要两件事:

  1. 将组合列表包装为类属性的方法
  2. 使属性可缓存的方法(最好是作为装饰器)
  3. 我不想处理的是每次调用时进行列表编译所产生的额外开销。

    我已经阅读并使用过缓存的属性装饰器,但我并不清楚它们是如何工作的和/或它们是否可以很容易地适应列表。

    注意:虽然做作,但这里的例子是为了让事情变得简单。这里的长期目标是根据应用程序配置提供2组不同的路由。

2 个答案:

答案 0 :(得分:1)

您的起始假设是,路线列表是根据每个请求计算的,这是错误的。这些是在模块级别定义的,因此将在第一次导入时计算,即每个实例启动时。预编译或记忆完全相同。

答案 1 :(得分:1)

如果我误解你,我道歉,但是......这基本上可以做你想要的吗? ..

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]