Вы проверили свой фрагмент.xml, если использовали внутри него какие-либо идентификаторы? Если да, вы должны убедиться, что фрагмент уничтожен, прежде чем открывать его снова.
Идея состоит в том, что Ваш декоратор является функцией, возвращая декоратора.
ПЕРВАЯ Запись Ваш декоратор, как будто Вы знали свой аргумент, была глобальной переменной. Скажем, что-то как:
-
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 в качестве аргумента, и возвратите своего декоратора.
-
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
Ответ Paul хорош, я переместил бы объект кэша, таким образом, он не должен быть создан каждый раз, и разработайте свой кэш так, чтобы он повысил 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
Да это. Как Вы знаете, декоратор является функцией. При записи в форме:
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 функцию с '/path/to' сначала. Затем результат вызова к mydecorator(path)
будет назван для получения функции foo
. Вы эффективно определяете динамическую функцию обертки.
Короче говоря Вам нужен другой слой функций декоратора.
Вот этот немного глупый пример:
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