Пропустить передавать аргументы декораторам Если вы уже знаете, что за декоратор является
Что такое декоратор?
Декоратор позволяет пользователю добавлять функциональность к существующей функции, не изменяя ее структуру.
Например, нам может понадобиться способ аутентификации вызова API, и только затем позволить возвращать некоторые данные. Мы можем упростить процесс аутентификации, абстрагируя его в функцию декоратора.
Рассмотрим следующую функцию, которая должна быть аутентифицирована,
def foo(user_id): # perform some DB calls # perform some DB writes pass
Мы можем использовать декоратор следующим образом,
def authenticate(func): def wrapper(*args, **kwargs): # perform auth checks if auth: func(*args, **kwargs) else: raise Exception('not authenticated') return wrapper
И, следовательно, аутентификация foo
так же просто, как,
@authenticate def foo(user_id): # perform some DB calls # perform some DB writes pass
Передавать аргументы декораторам
Теперь, когда у нас есть некоторые знания о декораторах, давайте перейдем к чему -то более интересному. Как бы мы передали аргументы декораторам?
Здесь он немного запутан – нам нужно будет создать фабрику декоратора, которая возвращает конкретный декоратор на основе принятых аргументов.
Простой вариант использования может быть, когда мы хотим Вызовите функцию несколько раз , но мы не хотим писать это в явной для цикла, и мы не хотим использовать для цикла внутри самой функции.
Например, мы хотели бы вызвать функцию foo
ниже, 10 раз:
def foo(): print("Hello World")
В этом сценарии мы можем создать фабрику декоратора, которая принимает номер
и возвращает декоратор, который называет функцию A номер
времена.
def call(number): # Decorator factory def decorator(func): def wraps(*args, **kwargs): for i in range(number): func(*args, **kwargs) return wraps return decorator
И использовать фабрику декоратора выше,
@call(10) def foo(): print("Hello World")
Когда мы называем foo
в настоящее время,
>>> foo() Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World
Спасибо за чтение! Пожалуйста, ударите меня по адресу sanjay.rohit2@gmail.com для любых отзывов:)
Оригинал: “https://dev.to/rohitsanj/decorator-factory-how-to-pass-arguments-to-decorators-3a19”