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: 'type' object is not iterable」というエラーが表示されます。

だから私は2つのことが必要です:

  1. 結合されたリストをクラス プロパティとしてラップする方法
  2. プロパティをキャッシュ可能にする方法 (できればデコレータとして)

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

キャッシュされたプロパティデコレータについて読んで使用しましたが、それらがどのように機能するか、および/またはリストを操作するために簡単に適応できるかどうかについてはよくわかりません。

注: わざとではありますが、ここでの例は単純にすることを目的としています。ここでの長期的な目標は、アプリの構成に応じて 2 つの異なるルート セットを提供することです。

4

2 に答える 2

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 に答える
1

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

于 2012-02-29T11:53:31.843 に答える