2012-12-17 11 views

Antwort

5

Einer der Hauptunterschiede ist in der Dokumentation aufgeführt, mit der Sie verknüpft sind: decorator behält die Signatur der umbrochenen Funktion bei, während wraps dies nicht tut.

+0

Dies scheint nicht mehr der Fall zu sein, ist das richtig? –

+0

@ChieltenBrinke: Sie meinen, dass 'functools.wraps' jetzt die Signatur bewahrt? Ich sehe in den Dokumenten nichts davon, aber ich habe Python 3.5 nicht installiert, um es zu testen. – BrenBarn

+0

Vereinbarte es nicht in der Dokumentation, aber das Testen in der Python-Shell (3.4) schien zu sagen, dass es funktioniert –

1

Nach der Diskussion mit BrenBarn, behält heute functools.wraps auch die Signatur der umgebrochenen Funktion bei. IMHO das macht die decorator Dekorateur fast obsolet.

from inspect import signature 
from functools import wraps 

def dec(func): 
    def wrapper(*args, **kwargs): 
     return func(*args, **kwargs) 
    return wrapper 

def dec2(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     return func(*args, **kwargs) 
    return wrapper 

def foo(a: int, b): 
    pass 

print(signature(dec(foo))) 
print(signature(dec2(foo))) 

# Prints: 
# (*args, **kwargs) 
# (a:int, b) 

Beachten Sie, dass ein signature und nicht getargspec zu verwenden hat. Getestet mit Python 3.4.

Verwandte Themen