← retour aux snippets

functools.wraps: décorateurs qui préservent les métadonnées

Conserver __name__, __doc__ et la signature lors du wrapping d'une fonction.

python patterns #functools#wraps#decorators

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.