質問

私は見ているキャッシュデコレータが与えられ機能キャッシュに書き込みの機能で指定された位置に飾られています。のようなこと:

@cacheable('/path/to/cache/file')
def my_function(a, b, c):
    return 'something'

この引数にデコレータは完全に別個の引数の機能がします。ったものも数例しか事例があったらもうかがうことができ、引数のデコレータと無関係ないのに包まれた機能しているのでしょうか。

役に立ちましたか?

解決

の考えは、あなたのデコレータが返すデコレータ.

お書きデコレータ、またはお引数がグローバル変数となります。ということかのようなもの:

-

def decorator(f):
  def decorated(*args,**kwargs):
      cache = Cache(cachepath)
      if cache.iscached(*args,**kwargs):
          ...
      else:
          res = f(*args,**kwargs)
          cache.store((*args,**kwargs), res)
          return res
  return decorated

その ような関数を書くのかcachepathとしてarg、お帰りデコレータ.

-

def cache(filepath)
    def decorator(f):
      def decorated(*args,**kwargs):
          cache = Cache(cachepath)
          if cache.iscached(*args,**kwargs):
              ...
          else:
              res = f(*args,**kwargs)
              cache.store((*args,**kwargs), res)
              return res
      return decorated
    return decorator

他のヒント

はい、そうです。ご存知のように、デコレータは関数です。形式で書かれたときます:

def mydecorator(func):
   def wrapper(*args, **kwargs):
       return func(*args, **kwargs)
   return wrapper

@mydecorator
def foo(a, b, c):
    pass

mydecoratorに渡される引数は、関数fooそのものです。

デコレータは、引数、コールを受け付けると@mydecorator('/path/to')実際に最初の「/に/パス」とmydecorator関数を呼び出すために起こっています。その後mydecorator(path)への呼び出しの結果は、機能を受け取るために呼び出されます<=>。あなたが効果的にダイナミックなラッパー関数を定義している。

一言で言えば、あなたはデコレータ機能の別の層を必要とします。

ここでは、この少し愚かな例です。

def addint(val):
    def decorator(func):
        def wrapped(*args, **kwargs):
            result = func(*args, **kwargs)
            return result + val
        return wrapped # returns the decorated function "add_together"
     return decorator # returns the definition of the decorator "addint"
                      # specifically built to return an extra 5 to the sum

@addint(5)
def add_together(a, b):
    return a + b

print add_together(1, 2)
# prints 8, not 3

ポールの答えは良いですが、私はそれがすべての時間を構築する必要がありませんので、キャッシュオブジェクトを移動し、キャッシュ・ミスがある場合、それはKeyErrorを送出しますように、あなたのキャッシュを設計します。

def cache(filepath):
    def decorator(f):
        f._cache = Cache(cachepath)
        def decorated(*args,**kwargs):
            try:
                key = (args, kwargs)
                res = f._cache.get(key)
            except KeyError:
                res = f(*args, **kwargs)
                f._cache.put(key, res)
            return res
        return decorated
    return decorator
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top