deflog(fn):defwrapper(*args,**kwargs):print(f"calling {fn.__name__}") result = fn(*args,**kwargs)print(f"done {fn.__name__}")return result
return wrapper
@logdefadd(a, b):return a + b
add(1,2)# calling add# done add# → 3
defretry(times:int):defdeco(fn):defwrapper(*args,**kwargs):for i inrange(times):try:return fn(*args,**kwargs)except Exception:if i == times -1:raisereturn wrapper
return deco
@retry(times=3)deffetch(url):...
from functools import wraps
deflog(fn):@wraps(fn)# 이걸 안 쓰면 wrapper.__name__ == "wrapper"가 된다defwrapper(*args,**kwargs):return fn(*args,**kwargs)return wrapper