那个 TraceDict([('hi', 1)]) 的调用,本质上传了两个参数:
一个是 self
一个是 [('hi', 1)]
在 wrapper 看来,args 就是 (self, [('hi', 1)])
在 wrapper 里调用 func 参数也是 (self, [('hi', 1)])
到了 func 也就是 __init__ 里,self 就是那个 self,args 只剩下 ([('hi', 1)],) 了
你可以加上绿的那句话看看
然后由于 finally 里 print 的时候这个 TraceDict 已经构造完了,所以打出来的 self
就有值了
【 在 gzq830510 (圡圡的包子——月如挚爱) 的大作中提到: 】
from functools import wraps
def trace_func(func):
if hasattr(func, 'tracing'):
return func
@wraps(func)
def wrapper(*args, **kwargs):
result = None
try:
result = func(*args, **kwargs)
return result
except Exception as e:
result = e
raise
finally:
print(f'{func.__name__}({args!r}, {kwargs!r}) -> {result!r}')
wrapper.tracing = True
return wrapper
class TraceDict(dict):
@trace_func
def __init__(self, *args, **kwargs):
# print(f'{args!r})
super().__init__(*args, **kwargs)
@trace_func
def __setitem__(self, *args, **kwargs):
return super().__setitem__(*args, **kwargs)
@trace_func
def __getitem__(self, *args, **kwargs):
return super().__getitem__(*args, **kwargs)
trace_dict = TraceDict([('hi', 1)])
trace_dict['there'] = 2
trace_dict['hi']
try:
trace_dict['does not exist']
except KeyError:
pass
else:
assert False
--
FROM 114.242.94.*