# simple decoratordef my_decorator(func): def wrapper(): print("Before") func() print("After") return wrapper@my_decoratordef say_hello(): print("Hello!")say_hello()#ans: Before#ans: Hello!#ans: After
# decorator for functions with argsdef my_decorator(func): def wrapper(*args, **kwargs): print("Before") result = func(*args, **kwargs) print("After") return result return wrapper@my_decoratordef add(a, b): return a + badd(5, 3)#ans: Before, After, returns 8
# without @ syntaxdef greet(): print("Hello")greet = my_decorator(greet)#ans: equivalent to @my_decorator
from functools import wraps# preserve function infodef my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper@my_decoratordef my_func(): """Docstring""" passmy_func.__name__#ans: "my_func" (not "wrapper")
# what is returned?def decorator(func): def wrapper(): return func() return wrapper@decoratordef func(): return 5func()#ans: 5
# decorator execution?def decorator(func): print("Decorating") return func@decoratordef func(): pass#ans: "Decorating" (at definition time)
# nested decorators?def dec1(func): def wrapper(): print("1") return func() return wrapperdef dec2(func): def wrapper(): print("2") return func() return wrapper@dec1@dec2def func(): passfunc()#ans: 1, 2 (bottom to top)
# decorator without wrapper?def decorator(func): return func@decoratordef func(): pass#ans: valid (identity decorator)
# accessing original?def decorator(func): def wrapper(): return func() wrapper.original = func return wrapper@decoratordef func(): passfunc.original
# decorator modifying return?def double(func): def wrapper(*args): return func(*args) * 2 return wrapper@doubledef add(a, b): return a + badd(2, 3)#ans: 10
# decorator with closure?def make_bold(func): def wrapper(): return f"<b>{func()}</b>" return wrapper@make_bolddef get_text(): return "Hello"get_text()#ans: "<b>Hello</b>"
# class as decorator?class Decorator: def __init__(self, func): self.func = func def __call__(self, *args): return self.func(*args)@Decoratordef func(): pass
# without @wraps?def decorator(func): def wrapper(): return func() return wrapper@decoratordef func(): passfunc.__name__#ans: "wrapper"
# decorator return None?def decorator(func): def wrapper(): func() return wrapper@decoratordef func(): return 5func()#ans: None (wrapper doesn't return)
Google tag (gtag.js)