我有一个可调用的类:
class CallMeMaybe:
__name__ = 'maybe'
def __init__(self):
self.n_calls = 0
def __call__(self):
self.n_calls += 1
raise Exception
这似乎像宣传的那样工作:
>>> f = CallMeMaybe()
>>> f.n_calls
0
>>> for i in range(7):
... try:
... f()
... except Exception:
... pass
...
>>> f.n_calls
7
我想用指数退避来装饰它:
from backoff import on_exception, expo
dec = on_exception(expo, Exception, max_tries=3, on_backoff=print)
f = CallMeMaybe()
f2 = dec(f)
现在看起来属性访问停止工作:
>>> f2.n_calls
0
>>> f2()
{'target': <__main__.CallMeMaybe object at 0xcafef00d>, 'args': (), 'kwargs': {}, 'tries': 1, 'elapsed': 2.1e-05, 'wait': 0.4843249208229148}
{'target': <__main__.CallMeMaybe object at 0xcafef00d>, 'args': (), 'kwargs': {}, 'tries': 2, 'elapsed': 0.484935, 'wait': 1.6524016553598126}
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
... blah blah blah
>>> f2.n_calls
0
我的问题:谁将 name 复制n_calls
到f2
的命名空间中,为什么?现在它拥有一个陈旧的值 - 正确的值应该是 3:
>>> f2.__wrapped__.n_calls
3