decorator python
'pass function which we want to decorate in decorator callable object'
def our_decorator(func): # func is function to be decorated by decorator
def wrapper(x): # x is parameter which is passed in func
if x%2==0:
return func(x)
else:
raise Exception("number should be even")
return wrapper
@ our_decorator
def func(x): # actual function
print(x,"is even")
func(2)
func(1)
' if you do not want to use @'
func=our_decorator(func)
func(2)
# Decorator with arguments
import functools
# First function takes the wanted number of repetition
def repeat(num_times):
# Second function takes the function
def decorator_repeat(func):
# Third function, the wrapper executes the function the number of times wanted
# functools decorator to print the true name of the function passed instead of "wrapper"
@functools.wraps(func)
def wrapper(*args, **kwargs):
for _ in range(num_times):
result= func(*args, **kwargs)
return result
return wrapper
return decorator_repeat
# Our function using the decorator
@repeat(num_times= 3)
def greet(name):
print(f"Hello {name}")
greet("thomas")
def hello_decorator(func):
def inner1(*args, **kwargs):
print("before Execution")
# getting the returned value
returned_value = func(*args, **kwargs)
print("after Execution")
# returning the value to the original frame
return returned_value
return inner1
# adding decorator to the function
@hello_decorator
def sum_two_numbers(a, b):
print("Inside the function")
return a + b
a, b = 1, 2
# getting the value through return of the function
print("Sum =", sum_two_numbers(a, b))
#Decorator are just function that take function as first
#parameter and return a function
def logging(f):
def decorator_function(*args, **kwargs):
print('executing '+f.__name__)
return f(*args, **kwargs)
return decorator_function
#Use it like this
@logging
def hello_world():
print('Hello World')
#calling hello_world() prints out:
#executing hello_world
#Hello World