вызов асинхронной функции

Есть такая конструкция:

@dp.callback_query_handler(lambda c: c.data == 'button1')
async def process_callback_button(callback_query: types.CallbackQuery):
    button_push = callback_query
    await bot.answer_callback_query(callback_query.id, config.switch_button.get(button_push))
    print(button_push.data)
    push = button_push.data
    button_request = config.switch_button.get(push)
    print(button_request)
    con = pymysql.connect(host='', user='', password='', database='testop')
    with con:
        cur = con.cursor()
        cur.execute(button_request)
        rows = cur.fetchone()
        print(rows)
        await bot.send_message(callback_query.from_user.id, rows)

Кроме декоратора асинхронная функция повторяется! Вынес ее в отдельный файл funcp и делаю вызов и теперь пишет инвалид синтаксис. Как с этим декоратором вызвать функцию? Я делаю так:

@dp.callback_query_handler(lambda c: c.data == 'button1')
async funcp.process_callback_button() 


Ответы (1 шт):

Автор решения: insolor

Декоратор (без параметров) - это функция, которая на вход получает какую-то функцию, добавляет свою функциональность (например, выполнение какого-то кода до или после выполнения самой функции) и возвращает новую функцию.

Декоратор с параметром - это функция, которая возвращает декоратор, который уже в свою очередь принимает декорируемую функцию, и как-то ее "модифицирует" (добавляет свою функциональность).

Такая конструкция:

@some_decorator(some_param=123)
def function():
    pass

Эквивалентна такому коду:

def function():
    pass

function = some_decorator(some_param=123)(function)

Если нужно вызывать функцию с разными декораторами, можно прям перед вызовом "создавать" новую функцию с нужным декоратором:

async def function():
    pass

...

async def something():
    decorated_function = some_decorator(some_param=123)(function)
    await decorated_function()
    # Или то же самое одной строкой:
    await some_decorator(some_param=123)(function)()

Если нужно просто чтобы функция была одна, но было несколько ее модификаций с разными декораторами (или одним и тем же декоратором с разными параметрами), то можно написать так:

def function():
    pass


function1 = some_decorator(some_param=123)(function)
function2 = some_decorator(some_param=345)(function)
...

Дальше уже с function1, function2 и т.д. работать как с обычными функциями.

→ Ссылка