如果预编译属性是在第一次访问时计算和缓存的属性;我想做同样的事情,而是采取多个列表并将它们编译成一个主列表。
对于一些背景知识,我目前正在构建一个站点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组不同的路由。
答案 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]