@heshhe

Как улучшить обработчик условий?

Есть один бот, написан с использованием библиотеки vkbottle
Бот по команде выдает массив строк. Количество строк от 0 до +50
На данный момент есть обработчик для 5 строк
Помогите разобраться - можно ли написать условие и вывод таким образом, что бы он зависел от общего кол-ва строк в массиве и что б это не выглядело как +50 elif

@bot.on.message(text=comm)
async def wrapper(ans: Message):
#функция слушает сообщения и отвечает на них, если текст ранее отправленного сообщения входит в 
# список команд comm
	try: 
#подключение к базе 
		conn = sqlite3.connect("DBNAME")
		cursor = conn.cursor()
		cursor.execute("ЗАПРОС ДАННЫХ ИЗ БАЗЫ" )
		data = cursor.fetchall()
		conn.commit()
		conn.close()

		if len(data) == 0:
#Проверка нулевого значения ans - сообщение пользователю, туда можно передавать только str 
			await ans("В базе пока нет таких данных :С")
		else:
#Функции которые забирают из массива нужное кол-во строк 
			def variant_one(v):
#Одну строку, с тремя ее значениями
				return data[v][0]+'\n'+ data[v][1]+' '+ data[v][2] +'\n'+ data[v][3]
			def variant_two(vtw,vtwo):
#Две строки 
				return variant_one(vtw) +'\n\n'+ variant_one(vtwo)
			def variant_three(vt,vto,vtt):
#Три
				return data[vt][0]+'\n'+ data[vt][1]+' '+ data[vt][2] +'\n'+ data[vt][3]+'\n\n'+ \
					  data[vto][0]+'\n'+ data[vto][1]+' '+ data[vto][2] +'\n'+ data[vto][3]+'\n\n'+ \
					  data[vtt][0]+'\n'+ data[vtt][1]+' '+ data[vtt][2] +'\n'+ data[vtt][3] 
#И в зависимости от их  кол-ва в массиве  выводят сообщение с нужным набором
			if len(data) == 1:
				await ans(variant_one(0))
			elif len(data) == 2:
				await ans(variant_two(0,1))
			elif len(data) == 3:
				await ans(variant_three(0,1,2))
			elif len(data) == 4:
				await ans(variant_three(0,1,2)+'\n\n'+ variant_one(3))
			elif len(data) == 5:
				await ans(variant_three(0,1,2)+'\n\n'+ variant_two(3,4))
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
@bacon
Начните с того, что вы в async используете блокирующие вызовы для работы с БД, это убивает весь смысл использования asyncio.
И да тут можно все if заменить одной функций, только пока сложно понять логику разбиения, опишите ее словами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы