objectif
Conserver name, doc et la signature lors du wrapping d’une fonction.
code minimal
import functools, inspect
def deco(f):
@functools.wraps(f)
def wrapper(*a, **k): return f(*a, **k)
return wrapper
@deco
def add(x:int, y:int)->int: "sum"; return x+y
sig = inspect.signature(add)
print(add.__name__ == "add" and "sum" in (add.__doc__ or "") and "(x: int, y: int) -> int" in str(sig))
utilisation
import functools
def deco(f):
@functools.wraps(f)
def w(*a, **k): return f(*a, **k)
return w
@deco
def f(): return 1
print(f.__name__ == "f")
variante(s) utile(s)
import functools
def d(f):
@functools.wraps(f)
def w(*a, **k): return f(*a, **k)
return w
@d
def g(x): return x+1
print(g.__wrapped__(2) == 3)
notes
- wraps met à jour wrapper.dict et ajoute wrapped pour introspection.
- Indispensable pour les décorateurs réutilisables/testables.