• Как добавить синхронность в асинхронный код?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, задумайся: что значит "три пользователя её вызвали"?
    Время доставки пакета по сети неравномерно. Первый пользователь мог нажать "Отправить" чуть раньше, но его сообщение будет доставлено после второго. Так что вопрос обеспечения корректного порядка УЖЕ непрост.
    Далее, ключевая идея аснихронности как раз в том, что во время паузы в обслуживании одного запроса мы можем заниматься другим запросом.

    Включая режим Ванги, я могу предположить, что в твоём боте используются глобальные переменные для хранения данных, и ты споткнулся о ситуацию, когда при приходе двух близких по времени запросов их значения перезаписываются. И вместо того, чтобы это исправить с помощью организации данных как хранилища ключ-значение (ид пользователя - сохранённые данные), ты пытается поставить пользователей в очередь.
    Ответ написан
    4 комментария
  • Как реализовать поиск на Python?

    Vindicar
    @Vindicar
    RTFM!
    Гугл по python full text search нашел whoosh, может, подойдёт?
    Ответ написан
    Комментировать
  • Как сделать безопасно строку с sql запросом и различными параметрами?

    Vindicar
    @Vindicar
    RTFM!
    Имена таблиц и столбцов можно подставлять f-строкой, если у тебя нет другого выбора и ты гарантируешь, что туда не попадёт пользовательский ввод.
    Для значений нужно использовать подстановку параметров.
    Ответ написан
    Комментировать
  • Как работает изнутри метод remove in Python?

    Vindicar
    @Vindicar
    RTFM!
    Тыц.
    Если коротко - перебирает элементы списка, сравнивает с каждым. Если нашёл равный - удаляет.
    Удаление, походу, делается через срезы. Занятно.
    Ответ написан
    4 комментария
  • Как работать с Socketserver в Python?

    Vindicar
    @Vindicar
    RTFM!
    Ни в передоваемую строку же засовывать метку и потом искать ее усллвием if и разделять поток выполнения?..

    Именно так. Это и есть описание протокола обмена данными: как разделить передаваемый поток байт на отдельные "команды", где в них будут "инструкции" (идентификатор выполняемой команды), а где "аргументы", как выглядт отклики на команды, и т.п.

    Собственно, есть готовые решения, типа protobuf. Они позволяют описать "пакеты данных", а разграничение, идентификацию и т.п. берёт на себя фреймворк. Или можно использовать в качестве транспорта какой-то готовый протокол, который может передавать структурированную информацию. Например, HTTP.
    Ответ написан
    1 комментарий
  • Объясните, что у меня не так?

    Vindicar
    @Vindicar
    RTFM!
    cursor.execute(f"SELECT users FROM balance WHERE uid={author.id}")
        sql = "SELECT balance FROM users"
        result = cursor.execute(sql)

    Ты сначала выполняешь кривой (но правильный по сути) запрос, потом ТУТ ЖЕ перебиваешь его другим, неправильным, и читаешь результаты неправильного. Стоит ли удивляться.
    Ответ написан
    Комментировать
  • Как выбрать из дат те что были на этой неделе?

    Vindicar
    @Vindicar
    RTFM!
    1. Берёшь текущую дату
    2. Находишь её код дня недели (dayofweek).
    3. Вычитаешь из её кода код понедельника (смотри в документации), получаешь разность d
    4. Вычитаешь из текущей даты d дней, получаешь дату понедельника на этой неделе.
    5. Прибавляешь к дате понедельника 7 дней, получаешь дату следующего понедельника.
    6. Проверяешь искомую дату на вхождение в этот диапазон.

    Альтернативно вместо 3. и 4., в цикле вычитаешь из текущей даты 1 день, пока не получишь понедельник.
    Ответ написан
    Комментировать
  • Три аргумента в discord записываются как один. Как починить?

    Vindicar
    @Vindicar
    RTFM!
    async def reg(ctx, *, idn: str = None, name: str = None, steamid: str = None):

    Ну ты сам же просишь закинуть все параметры в idn. Читай доки, как discord.py интерпретирует * (keyword-only параметр).
    Ответ написан
    Комментировать
  • Как в telegram bot после каждого сообщения пользователя обновлять время в бд?

    Vindicar
    @Vindicar
    RTFM!
    Почитай про INSERT ... ON CONFLICT UPDATE.
    Ответ написан
    Комментировать
  • Как можно сочетать aiogram с aioshedule?

    Vindicar
    @Vindicar
    RTFM!
    while True:
            await aioschedule.run_pending()

    Из-за этого обработчик события не завершится нормально. Вынеси этот цикл отдельно, и запусти его один раз через asyncio.create_task() при старте бота.
    Ответ написан
    Комментировать
  • Как вытащить значение из потока?

    Vindicar
    @Vindicar
    RTFM!
    Ну конечно start() возвращает None, чего ты ожидал? На момент завершения start() поток ещё неизвестно сколько работать будет, откуда start() знать, что он в итоге вернёт?

    Сделай класс-наследник Thread(), и переопредели в нём метод run().
    Тогда ты сможешь объявлять в этом классе свои поля, и использовать их как захочешь - например, для возврата результатов.
    Ответ написан
  • Телеграм-бот. Как сохранить второе сообщение от пользователя?

    Vindicar
    @Vindicar
    RTFM!
    У тебя должен быть отдельный обработчик входящих сообщений, а не часть обработчика нажатия на кнопку..
    При этом бот должен помнить, ведёт ли данный пользователь игру в настоящий момент, или нет.
    Ответ написан
  • Почему не работает прерывание программы при нажатии кнопки?

    Vindicar
    @Vindicar
    RTFM!
    getch() не позволяет читать клавиши-модификаторы, типа Alt. Используй модуль keyboard.
    Ответ написан
    Комментировать
  • Почему не работает рандомайзер в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты из всего модуля random импортируешь только одну функцию random(), а использовать пытаешься random.randint(). Делай просто import random.
    Ответ написан
    Комментировать
  • Как умножить списки разной длины в python?

    Vindicar
    @Vindicar
    RTFM!
    for i in index_list:
        mult *= rnd_list[i]

    Должно быть правильно. Если вываливается IndexError - значит, в index_list есть индексы, которые не вписываются в rnd_list - либо >N-1, либо <-N. Уточняй условие задачи, что делать, если встретились такие индексы.
    Ну и можно для уточнения ситуации сделать так:
    N = len(rnd_list)
    for i in index_list:
        try:
            value = rnd_list[i]
        except IndexError:
            print(f'Не удалось взять элемент с индексом {i}, он не в диапазоне {-N}...{N-1}. Игнорирую индекс.')
        else:
            mult *= value
    Ответ написан
    2 комментария
  • Из за чего команда 9Abelora выполняется первее чем raspisanie?

    Vindicar
    @Vindicar
    RTFM!
    Изучай документацию, а не "уроки" с ютуба.
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
       ...

    func принимает функцию, которая должна по параметру call (сведения о нажатии кнопки) определить, будет ли данный обработчик обрабатывать это нажатие. Соответственно, функция вида lambda call: True всегда будет отвечать "да, я буду обабатывать!".

    При этом бот вызовет первый "согласившийся" обработчик, и ТОЛЬКО его. Как следствие, наличие одного обработчика с func=lambda call: True блокирует все нижележащие обработчики, так как этот "всеядный" обработчик будет брать на себя все нажатия кнопок (независимо от того, понимает ли он их). До остальных обработчиков дело просто не дойдёт.

    Чтобы это разрулить, надо прописывать не lambda call: True, а функцию, которая реально будет различать, какой набор кнопок у пользователя, и какая кнопка была нажата. Самый простой способ это сделать - сделать этакую иерархию в строке call.data. Например:
    9a.tomorrow
    9a.week
    9a.today
    10a.tomorrow
    10a.week
    10a.today

    Тогда ты сможешь прописать обработчики вида:
    @bot.callback_query_handler(func=lambda call: call.data.startswith('10a.'))
    def callback_inline_for_10a(call):
       ...  # тут обрабатываем кнопки для 10А
    
    @bot.callback_query_handler(func=lambda call: call.data.startswith('9a.'))
    def callback_inline_for_9a(call):
       ...  # тут обрабатываем кнопки для 9А


    Ну а создание кнопок, соответственно, будет иметь вид
    item1 = types.InlineKeyboardButton("Домашнее задание на завтра", callback_data='10a.tomorrow')
    Ответ написан
    4 комментария
  • Не отправляются фотографии пользователю в библеотеке telebot, что делать?

    Vindicar
    @Vindicar
    RTFM!
    def raspisanie(message):
    def raspisanie(call):
    Ничего странного не замечаешь?
    Ответ написан
  • Как сделать создание текстового канала с правами через кнопку в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Добавь в конструктор Menu параметр ct и сохраняй его в self.category.
    Тогда при создании меню ты передашь туда ctx.channel.category, а внутри кнопка1() сможешь это поле использовать.

    Отдельный минус за мат в вопросе. Это не делает тебя взрослее.
    Ответ написан
  • Можно ли в качестве значения для поля класса данных python использовать генератор?

    Vindicar
    @Vindicar
    RTFM!
    r1 = Row()
    r1.cells = generator_1(3)

    Ну во-первых, это выглядит скорее как обычная переменная, а не как поле класса. Будь это хотя бы вида
    r1 = Row(table, 3) # 3я строка таблицы table, это имело бы смысл

    Во-вторых, что за "восход солнца вручную"?
    for i in range(5):  # нам нужно знать длину строки?
        cell_val = next(r1.cells, None)
        print (cell_val)

    Почему не сделать
    for cell_val in r1:
        print (cell_val)

    если генераторы по определению заточены под итерацию по ним.

    В-третьих, реализация cut_value откровенно неудачная - это должно быть property. Сейчас, если value изменится, cut_value уже не будет ему соответствовать. Придётся помнить, что нужно изменять и то, и то.

    Ну и главное - генераторы одноразовые! Тебе придётся явно перезадавать их после использования, что убивает весь смысл.

    В целом, я бы сказал, что ты не понимаешь главную идею того, зачем вообще наворачивают подпрограммы, классы и прочие абстракции: спрятать сложность реализации за простым интерфейсом. Классом должно быть проще пользоваться, чем переписать его с нуля. В приведённом коде это не так.

    Вообще, если тебе интересно, как организовать массив - посмотри в сторону numpy. Там очень удобно сделана работа с массивами, и даже небольшого подмножества фич будет достаточно. В общем-то, возникает вопрос, а так ли нужны отдельные классы Row и Column.
    Ответ написан
  • Как отправить сообщений в определенное время telebot?

    Vindicar
    @Vindicar
    RTFM!
    телебот - это синхронная библиотека. Он не предусматривает длительной работы обработчиков.
    Так что тебе придётся выносить ожидание момента (тот же пакет schedule) в отдельный поток.
    Но я без понятия, безопасно ли обращаться к методам telebot из других потоков.
    Ответ написан