0

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

对于一点背景,我目前正在构建一个站点 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' object is not iterable”。

所以我需要两件事:

  1. 一种将组合列表包装为类属性的方法
  2. 一种使属性可缓存的方法(最好作为装饰器)

我不想处理的是在每次调用时进行列表编译所产生的额外开销。

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

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

4

2 回答 2

1

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

于 2012-02-29T11:53:31.843 回答
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]
于 2012-02-29T11:57:25.383 回答