2012-02-29 14 views
0

プリコンパイルされたプロパティが最初のアクセス時に計算されキャッシュされるプロパティの場合、私は同じことをしたいのですが、複数のリストを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例外: 'タイプ' オブジェクトは、反復可能ではありません"。クラスプロパティ

  • (できれデコレータとして)プロパティキャッシュできるようにする方法
  • として組み合わせリストをラップする

    1. 方法:

      は、だから私は2つのことを必要とします

      私が対処したくないのは、すべての呼び出しでリストのコンパイルを行うことによって発生する追加のオーバーヘッドです。

      キャッシングされたプロパティデコレータについて読んだことがありますが、どのように動作しているか、リストでの作業に簡単に適応できるかどうかはわかりません。

      注:意図していますが、ここの例は物事を簡単にするためのものです。ここでの長期目標は、アプリの設定に応じて2つの異なるルートセットを提供することです。

    答えて

    1

    ルートリストがすべてのリクエストで計算されるという前提は間違っています。これらはモジュールレベルで定義されているため、各インスタンスの起動時に最初にインポートされるときに計算されます。事前コンパイルやメモは、まったく同じことをします。

    +0

    ありがとう、私はちょうどその問題を考えすぎたと思います。 –

    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] 
    
    関連する問題