вызов асинхронной функции
Есть такая конструкция:
@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 шт):
Декоратор (без параметров) - это функция, которая на вход получает какую-то функцию, добавляет свою функциональность (например, выполнение какого-то кода до или после выполнения самой функции) и возвращает новую функцию.
Декоратор с параметром - это функция, которая возвращает декоратор, который уже в свою очередь принимает декорируемую функцию, и как-то ее "модифицирует" (добавляет свою функциональность).
Такая конструкция:
@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 и т.д. работать как с обычными функциями.