Python:デコレータの特定の引数と無関係に包まれた機能)?
質問
私は見ているキャッシュデコレータが与えられ機能キャッシュに書き込みの機能で指定された位置に飾られています。のようなこと:
@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
所属していません StackOverflow