コンパイル済みプロパティが、最初のアクセス時に計算およびキャッシュされるプロパティである場合。私も同じことをしたいのですが、代わりに、複数のリストを取得して 1 つのマスター リストにコンパイルします。
ちょっとした背景として、私は現在 GAE/python/webapp2/jinja2 というサイトを構築しています。細かいことはさておき、ルートのリストはかなり大きくなっています。現在、静的ルート、動的ルート、およびリダイレクトをすべて 1 つのリストにマッシュアップしています。
例:
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つのことが必要です:
- 結合されたリストをクラス プロパティとしてラップする方法
- プロパティをキャッシュ可能にする方法 (できればデコレータとして)
私が扱いたくないのは、すべての呼び出しでリストのコンパイルを行うことによって発生する追加のオーバーヘッドです。
キャッシュされたプロパティデコレータについて読んで使用しましたが、それらがどのように機能するか、および/またはリストを操作するために簡単に適応できるかどうかについてはよくわかりません。
注: わざとではありますが、ここでの例は単純にすることを目的としています。ここでの長期的な目標は、アプリの構成に応じて 2 つの異なるルート セットを提供することです。