Декораторы
@ProgHelpBotДекораторы
Представляют функцию, которая в качестве параметра получает функцию и в качестве результата также возвращает функцию. Декораторы позволяют модифицировать выполняемую функцию, значения ее параметров и ее результат без изменения исходного кода этой функции.
def select(input_func): # функция декоратор
def output_func(): # будет выполняться вместо оригинальной
print("-------------")
input_func() # вызов оригинальной функции
print("-------------")
return output_func
@select # применение декоратора
def say_hello(): # оригинальная функция
print("Hello, World!")
say_hello()
Результат:
------------- Hello, World! -------------
Получение параметров функции в декораторе
Декоратор может перехватывать передаваемые в функцию аргументы. Для этого в качестве параметров функции output_func() передаётся список значений *args и затем каждый аргумент получается с помощью индекса: args[0], args[1] и так далее.
def check(input_func):
def output_func(*args):
name = args[0]
age = args[1]
if age < 0: age = 0
input_func(name, age)
return output_func
@check
def print_person(name, age):
print(f"Name: {name}, age: {age}")
print_person("Alex", 38) # Name: Alex, age: 38
print_person("Alice", -5) # Name: Alice, age: 0
Получение результата функции
Подобным образом можно получить результат функции и при необходимости изменить его.
def check(input_func):
def output_func(*args):
result = input_func(*args)
if result < 0: result = - result
return result
return output_func
@check
def multiply(a, b):
return a * b
print(multiply(2, 5)) # 10
print(multiply(2, -5)) # 10