Рубрики
Без рубрики

Фабрика декоратора – как передавать аргументы в декораторы

Пропустите, чтобы передать аргументы декораторам, если вы уже знаете, что такое декоратор, что такое деко … Tagged с Python, Decorator, OOP.

Пропустить передавать аргументы декораторам Если вы уже знаете, что за декоратор является

Что такое декоратор?

Декоратор позволяет пользователю добавлять функциональность к существующей функции, не изменяя ее структуру.

Например, нам может понадобиться способ аутентификации вызова 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”