@krik4ch

Пишу бота для телеграм (telebot), проблема с асинхронными функциями. В чем причина ошибки?

Бот написан на библиотеке telebot. При выполнении следующего кода:
import telebot
from telebot import types
import sqlite3
import asyncio

#Функция возвращающая количество совпадений объекта с элементами таблицы
async def matches(file, table, column, id):
	x = 0
	with sqlite3.connect(file) as db:
		cursor = db.cursor()
		await cursor.execute(f"SELECT {column} FROM {table}")
		for i in cursor.fetchall():
			for y in i:
				if y == id:
					x += 1
	return x

#Функция добавления строки в таблицу
async def add(file, table, columns, values):
	with sqlite3.connect(file) as db:
		cursor = db.cursor()
		await cursor.execute(f"INSERT INTO {table}({columns}) VALUES ({values})")

#Функция для регистрации нового пользователя
async def registration(file, table, column, id, columns, values):
	if matches(file, table, column, id) == 0:
		await add(file, table, columns, values)
		print("YES")
	else:
		print("NO")

def start(message):
	registration("Data.db", "MainData", "id", message.chat.id, "id, name, wallet, role", f"{message.from_user.id}, 'none', 0, 0")

async def start_main(message):
	start(message)

async def main():
	@bot.message_handler(commands=["start"])
	await x = asyncio.create_task(startq(message))
	
asyncio.run(main())

bot.polling(none_stop=True)


Выдаёт следщую ошибку:
Traceback (most recent call last):
  File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 31, in <module>    start(fakepyfile,mainpyfile)
  File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 30, in start
    exec(open(mainpyfile).read(),  __main__.__dict__)
  File "<string>", line 40
    await x = asyncio.create_task(startq(message))
    ^
SyntaxError: invalid syntax

[Program finished]


Я новичок в программировании, знаю что зря полез в такие дебри как асинхронное программирование (я тот же sqlite выучил за 1 день), но мне очень нужна помощь. Если вы дадите какие-то совесть по оформлению или синтаксу кода, я буду вам нереально благодарен.
  • Вопрос задан
  • 1326 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
1. await так не пишется.
x = await asyncio.create_task(startq(message))
2. Зачем ты делаешь await?
asyncio.create_task() создаёт корутину, которая будет выполняться конкуррентно с текущей (как бы параллельно)
await приостанавливает выполнение текущей корутины, пока не завершится вызываемая (справа от await).
Т.е. await create_task(...) - это не очень осмысленно: сначала запускаешь параллельную корутину, а потом всё равно стоишь и ждёшь её.
Если тебе нужно запустить корутину startq() и дождаться её выполнения (ну и получить возвращаемое значение) - пиши просто x = await startq(message)
Если тебе нужно запустить корутину startq() и пусть она дальше выполняется сама по себе, тебе от неё ничего не надо - достаточно будет asyncio.create_task(startq(message))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
Если вы дадите какие-то совесть по оформлению или синтаксу кода, я буду вам нереально благодарен.

Мне вот интересно, вы ищите "советы" по каким-то вещам... Почему вам даже не приходит в голову поискать в офф.документации?
Как правильно писать то, что вы пытаетесь сделать там описано.
я тот же sqlite выучил за 1 день

Не очень похоже. То, что вы посмотрели, уж извините, говноролик* по типу "хреначим бота из палок и ..." не значит, что вы изучили что-то.
Конкретно - проблема в подобных выражениях:
cursor.execute(f"INSERT INTO {table}({columns}) VALUES ({values})")

Писать что-то подобное, тем-более в системе, с которая будет доступна другим людям в интернете можно только в случаях, когда вы целенаправленно хотите словить sql-инъекцию.
Изучайте основы по документации. По крайней мере какие-то базовые вещи там описаны максимально подробно и даже если вдруг не знаете английский - примеров столько, что даже без чтения понятно.
--
* - тут больше вопрос к автору сего творения, который мало-того, что сам не пойми как учится, так еще и путает других.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы