Назначение декоратора - PullRequest
       7

Назначение декоратора

0 голосов
/ 18 февраля 2020

Предположим, декоратор

@app.callback(
    Output("plot_1", "figure"),
    [Input("checklist", "value"),
     Input("radio", "value")])

, который повторяется в коде несколько раз. Единственная разница между копиями - это разные имена сюжетов.

Как можно назначить этот декоратор другому декоратору и использовать последний?

@new_callback("plot_1")

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Синтаксис Decorator - это просто ярлык для приложения функции; app.callback это просто функция. Создайте новую функцию, которая вызывает ее с фиксированными аргументами.

def new_callback(plot):
    return app.callback(
          Output(plot, "figure"),
          [
              Input("checklist", "value"),
              Input("radio", "value")
          ]
    )

app.callback сама по себе не является декоратором; это функция, которая возвращает декоратор (т. е. функция, которая принимает функцию для оформления в качестве аргумента).

@app.callback(...)
def foo():
    ...

эквивалентно

def foo():
    ...

foo = app.callback(...)(foo)
0 голосов
/ 18 февраля 2020

Вы можете обернуть декоратор в его собственный декоратор и использовать аргументы, которые вы передаете в любую из подфункций, например:

def decorator_wrapper(arg1):

    # do something with arg1:
    print('Inside decorator_wrapper, arg1: ' + str(arg1))

    def decorator(function):

        print('Inside decorator, arg1: ' + str(arg1))

        def wrapper(*args, **kwargs):

            print('Inside wrapper, arg1: ' + str(arg1))

            # execute decorated function: 
            result = function(*args, **kwargs)

            return result

        return wrapper

    return decorator


@decorator_wrapper('a')
def MyFunction():

    print('This is my function')


MyFunction()

Это приведет к:

Inside decorator_wrapper, arg1: a
Inside decorator, arg1: a
Inside wrapper, arg1: a
This is my function

Подробнее здесь: https://www.geeksforgeeks.org/decorators-with-parameters-in-python/

...