else:
role_cost = cursor.execute("SELECT cost FROM shop WHERE role_id = ?", (role.id, )).fetchone()
user_cash = cursor.execute("SELECT cash FROM users WHERE id = ?", (inter.id, )).fetchone()
if role_cost is None:
print('Нет такой роли! О_о') # ну или твоя реакция на подобное
return
if user_cash is None:
print('Нет такого юзера! O_o')
# ну или альтернативно, просто добавляешь этого юзера INSERT'ом и прописываешь
user_cash = (0, ) # как будто БД вернула нам 0 денег
if role_cost[0] <= user_cash[0]:
print('Выполняем операцию')
# в том числе обновляем количество денег
else:
print('Маловато будет!')
Почему у тебя в классе методы не содержат параметра self, и в то же время не помечены как @staticmethod?
И если ты используешь класс только как собрание функций, без создания экземпляров, на кой огурец тебе __init__()?
Wolf_Yout, тогда зачем askinfo.py? Почему бы в функциях, содержащих твою бизнес-логику, не использовать объект bot, переданный как параметр? И пусть дёргают его как им надо. Зачем заворачивать его методы в два слоя обёрток?
Не очень понятен смысл существования файла askinfo.py. И почему реализация этого функционала берётся из main.py, если в приведённом main.py есть только стартовый код?
Александр Кошелев, ну быстрый гуглинг находит вот это. Так как у них заявлена поддержка PEP 249, API очень похоже на встроенный питоновский sqlite. Пакет ibm_db_dbi по идее должен ставиться через pip.
Использовать для демонстрации фрагментов кода только специальный тег code или специальные демонстрационные ресурсы (например, JsFiddle - https://jsfiddle.net/). Размещение фрагментов кода в виде изображений запрещено.
zenondd, asyncio.get_running_loop() вернёт объект-реактор (loop) только если он уже создан для данного потока. Её имеет смысл использовать, когда ты уверен что реактор уже есть, так как она простая и быстрая.
Если реактора ещё нет, нужно создать его в начале скрипта через asyncio.new_event_loop().
Либо можно использовать asyncio.get_event_loop(), она создаст реактор если его еще нет или вернёт существующий.
zenondd, ну для простой периодичности этого хватит. Вот если что-то более сложное, там уже aioschedule потребуется. Еще один косяк этого решения - при перезапуске бота интервал "поедет", так как начнёт отсчитываться с момента запуска.
MaxiZm, в приведённом коде нет ожидания завершения первого потока. Твой главный поток создаёт экземпляр Human(), запускает первый дочерний поток, и идёт дальше, запускать второй. Это всё, что приведено в вопросе.
rodgi, а что ты тогда понимаешь под массивом? Потому что в Питоне массивы используются крайне редко (numpy особняком, это сторонний пакет и он заточен под числовые массивы в первую очередь) - просто за ненадобностью.
Списков (list) вполне хватает, благо они позволяют доступ по индексу.
Ну и? Что лежит в переменной frame к моменту выполнения этой строки? Если по факту.
И да, я бы проверял значение ret после capture.read(). Мало ли read() потерпел неудачу.
Kemper5454, включи уже голову.
Если определять не в цикле, то есть только два варианта:
1. определять после цикла, но до вывода
2. определять до цикла, после цикла проверять, изменилось ли значение.
Если определять после цикла, то тогда мы перезапишем значение, которое получили в цикле. Плохо.
Если определять до цикла, то если цикл произойдёт, то начальное значение перезапишется на значение из БД. Если цикл не произойдёт, начальное значение останется. Таким образом, можно будет проверить, произошел ли цикл.
Это же не специфически питонья штука, это просто логика. Есть причина, есть следствие.