Я пытаюсь написать декоратор, который «обновляется» после вызова, но где обновление происходит только один раз после выхода из последней функции. Вот пример:
@auto_refresh
def a():
print "In a"
@auto_refresh
def b():
print "In b"
a()
Если вызывается a()
, я хочу, чтобы функция обновления запускалась после выхода из a()
. Если вызывается b()
, я хочу, чтобы функция обновления запускалась после выхода из b()
, но не после a()
при вызове b()
. Вот пример класса, который делает это:
class auto_refresh(object):
def __init__(self, f):
print "Initializing decorator"
self.f = f
def __call__(self, *args, **kwargs):
print "Before function"
if 'refresh' in kwargs:
refresh = kwargs.pop('refresh')
else:
refresh = False
self.f(*args, **kwargs)
print "After function"
if refresh:
print "Refreshing"
С этим декоратором, если я запускаю
b()
print '---'
b(refresh=True)
print '---'
b(refresh=False)
Я получаю следующий вывод:
Initializing decorator
Initializing decorator
Before function
In b
Before function
In a
After function
After function
---
Before function
In b
Before function
In a
After function
After function
Refreshing
---
Before function
In b
Before function
In a
After function
After function
Таким образом, когда вы пишете таким образом, отсутствие указания аргумента refresh
означает, что по умолчанию установлено значение False
. Кто-нибудь может придумать способ изменить это так, чтобы refresh
было True
, когда не указано? Изменение
refresh = False
до
refresh = True
в декораторе не работает:
Initializing decorator
Initializing decorator
Before function
In b
Before function
In a
After function
Refreshing
After function
Refreshing
---
Before function
In b
Before function
In a
After function
Refreshing
After function
Refreshing
---
Before function
In b
Before function
In a
After function
Refreshing
After function
потому что тогда обновление вызывается несколько раз в первом и втором случае и один раз в последнем случае (когда оно должно быть один раз в первом и втором случае, а не в последнем случае).