如果预编译属性是第一次访问时计算并缓存的属性;我也想做同样的事情,但取而代之的是,获取多个列表并将它们编译为一个主列表。
对于一点背景,我目前正在构建一个站点 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”。
所以我需要两件事:
- 一种将组合列表包装为类属性的方法
- 一种使属性可缓存的方法(最好作为装饰器)
我不想处理的是在每次调用时进行列表编译所产生的额外开销。
我已经阅读并使用了缓存的属性装饰器,但我不太清楚它们是如何工作的和/或它们是否可以很容易地适应列表。
注意:虽然是人为的,但这里的示例是为了让事情变得简单。这里的长期目标是根据应用配置提供 2 组不同的路由。