• Как заставить def работать?

    Vindicar
    @Vindicar
    RTFM!
    Поучи язык. Просто поучи, без ботов.
    def объявляет функцию, но не вызывает её.
    Ты её объявляешь внутри record_volume(), но ничего с ней не делаешь.
    Ответ написан
    Комментировать
  • Как задать несколько значений одной команде?

    Vindicar
    @Vindicar
    RTFM!
    cоздать несколько отдельных BACK, но не меняя самого текстового значения?


    Освой finite state machines (FSM).
    Ответ написан
    2 комментария
  • Как добавить таймер?

    Vindicar
    @Vindicar
    RTFM!
    Elacov_top, для извлечения фрагментов из текста можно использовать регулярные выражения. Это позволит разбирать только фиксированный набор фраз, но этого зачастую хватает. Хуже с тем. что слово "пять" надо будет превратить в 5. Тут я даже навскидку не подскажу. Хотя есть средства разбора естественных языков, типа такого.

    У тебя другая проблема, поважнее. Ты представляешь, как вырастет твой if-if-if спустя 5-10 фич?
    Нужно декомпозировать простыню кода на отдельные части.
    Ответ написан
  • Почему после нажатия inline кнопки бот не запускает ее обработчик?

    Vindicar
    @Vindicar
    RTFM!
    lambda call: 'season'
    Это работает не так. Читай документацию.
    Лямбда должна вернуть истинное булево значение, если обработчик может обработать этот запрос, и ложное - если нет.
    Внезапно, любая непустая строка интерпретируется как истина. А значит, первый обработчик получает все запросы.
    Сравнивай call.data с искомой строкой.
    Ответ написан
    3 комментария
  • Почему дублируются байты, которые не влезли в размер буффера, при получении с помощью socket.recv?

    Vindicar
    @Vindicar
    RTFM!
    try:
                                data = self.sock.recv(constants.BUF_SIZE)
                            except socket.timeout:
                                message_ended = True
    
                            buff += data

    Если отработает except, предыдущее значение data не изменится, и к buff оно ВСЁ РАВНО приклеится.
    Закинь buff += data в ветку try-else.
    Ответ написан
    Комментировать
  • Как запустить код без ошибок?

    Vindicar
    @Vindicar
    RTFM!
    В коде отсутствует запуск бота. Так что он делает именно то, что от него просят.
    Ответ написан
    Комментировать
  • Json ключ value не парсится?

    Vindicar
    @Vindicar
    RTFM!
    Ну наверно нужно не цикл вкладывать в try, а наоборот?
    Ответ написан
  • Почему в БД значение меняется на 0?

    Vindicar
    @Vindicar
    RTFM!
    except:
                    db.set_active(row[0], 0)


    Ну а нечего делать голый except. У тебя при абсолютно любой ошибке отправки пользователь молча помечается как неактивный, даже если это какой-то несвязанный твой косяк. Выясни, какое именно исключение кидается при заблокированном получателе, и лови только его. Остальные исключения журналируй.
    Ответ написан
  • Можно ли прервать input()?

    Vindicar
    @Vindicar
    RTFM!
    Нет, стандартный input() этого не предусматривает.
    Но есть сторонние варианты, например, pytimedinput.
    Ответ написан
    Комментировать
  • Как реализовать остановку цикла for?

    Vindicar
    @Vindicar
    RTFM!
    Если тебе нужна проверка на останов после каждой операции - придётся-таки эту проверку производить после каждой операции. Да, можно схитрить, но от этого не уйдёшь.

    Я могу посоветовать убрать time.sleep() и заменить их на threading.Event.wait() с таймаутом - в этом случае, если Event будет взведено, то не придётся "досыпать". Но проверять исход ожидания всё равно придётся самому.

    Альтернативное, но ОЧЕНЬ кардинальное решение - сделать код асинхронным. Причина в том, что у асинхронных подпрограмм, завёрнутых в Task, есть механизм отмены, позволяющий принудительно выкинуть исключение в ходе выполнения любой длительной операции (любого await-вызова). По сути, это та же самая проверка - но встроенная.

    Это работает, так как асинхронный код выполняется в одном потоке. Провернуть такой же фокус, скажем, в многопоточном приложении - нетривиально и довольно рискованно.
    Ответ написан
    2 комментария
  • Почему не работает IF-ELSE?

    Vindicar
    @Vindicar
    RTFM!
    1. Как проверял? Просто пытался угадать? Рандом - штука такая, могло просто не везти.
    2. Если пользователь с первого раза введёт правильный key, условие цикла сразу будет False, и цикл не выполнится - а значит, не выполнятся и ifы.

    Я бы посоветовал сделать так:
    max_tries = 5  # число попыток
    key = -1  # заведомо некорректное значение
    for i in range(1, max_tries+1):
        key = int(input(f'Попытка №{i}: '))
        if key == lock:
            print(f'Угадал c {i}-й попытки!')
            break
    else:  # этот else относится к for! 
        # он выполнится, если for НЕ БЫЛ прерван по break
        print('Попытки кончились. =(')
    Ответ написан
    1 комментарий
  • Как инициализировать декоратор в классе, а внутри использовать этот декоратор?

    Vindicar
    @Vindicar
    RTFM!
    Ты хочешь поместить хэндлеры в класс?
    Я в таких случаях делаю немного иначе.
    Делаю свой декоратор, который принимает те же параметры, что и ботовый, но просто сохраняет их в отдельном атрибуте декорируемого метода. Благо методу можно создать новый атрибут через setattr() или простым присваиванием.
    При конструировании экземпляра класса через dir() перечисляю содержимое класса, ищу методы, среди них ищу методы с моим атрибутом (т.е. те, которые были декорированы). Для каждого такого метода получаю bound method (через getattr(self, method_name)) и вызываю оригинальный декоратор на нём с сохранёнными параметрами. Ведь декоратор - это функция, его можно вызывать как функцию.
    Часть, связанную с конструированием, можно спрятать или в родительском абстрактном классе, или в метаклассе, чтобы не повторять для каждого класса с обработчиками.
    Ответ написан
    Комментировать
  • Как можно сделать виртуальную «флешку», которая будет отображаться в проводнике windows 10?

    Vindicar
    @Vindicar
    RTFM!
    Вариант А. Написать и установить драйвер виртуальной файловой системы. Разумеется, не на питоне.

    Вариант Б. Создать сетевой ресурс (можно на localhost, т.е. "как бы" сетевой), поддерживающий протокол WebDAV или иной, поддерживаемый виндой (как делает та же Samba) и примонтировать его через системную команду net use.
    Это если нужен именно виртуальный диск.

    Вариант В. Есть ещё Windows Shell Namespace Extension для создания виртуальных папок. Вроде как не рекомендуется.

    Вариант Г. Cloud Sync Engine.

    Я бы сказал, вариант Б наиболее реализуем именно на питоне. Плюс он более кроссплатформенный, и в принципе можно разместить скрипт не на локальной машине, а в сети.
    Ответ написан
    Комментировать
  • Ошибка can't concat list to bytes?

    Vindicar
    @Vindicar
    RTFM!
    Проверяй, что творится в user[0]. Какие значения, какие типы данных, и т.п.
    Ответ написан
  • В чем может быть ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Вроде обрабатываю исключение на остановку программы

    Нет, не обрабатываешь. Ты ловишь Exception, а исключение KeyboardInterrupt наследуется не от него, а от BaseException - как раз, чтобы его случайно не поймать, когда не надо. Так что KeyboardInterrupt лучше ловить отдельно.

    Если тебе нужно гарантированно выполнить код при завершении работы программы, используй try...finally. В крайнем случае - модуль atexit.
    Ответ написан
  • Как реализовать многопоточность в Си?

    Vindicar
    @Vindicar
    RTFM!
    Многопоточность для какой платформы?
    Для unix - см. ответ serhiops.
    Для windows - читай про функцию api CreateThread().
    А на микроконтроллерных платформах свои заморочки, я с ними не знаком.
    Ответ написан
    Комментировать
  • Параллельный трафик через VPN?

    Vindicar
    @Vindicar
    RTFM!
    Не сработает. Ищи другие варианты.
    Что значит "другие VPNы"? Популярные VPN сервисы? Популярные VPN-протоколы?
    Потому что есть другие вещи, тот же shadowsocks - но это подразумевает наличие узла, где он развёрнут.
    Ответ написан
    1 комментарий
  • Как правильно обрабатывать сообщения пользователя телеграмм боту?

    Vindicar
    @Vindicar
    RTFM!
    Ищи инфу по finite state machine (FSM) и как она реализуется в pyTelegramBotAPI.

    Если коротко - для каждого пользователя нужно хранить его текущий шаг (начало, выбор предмета, выбор задания, и т.п.) и ассоциированные с этим шагом данные. Т.е. нужно хранилище вида ключ-значение. Ключом будет ID пользователя.
    В качестве такого хранилища можно использовать и обычный словарь (если допустимо, чтобы бот всё забывал при перезапуске), или базу данных.

    И да, ты спалил токен бота. Меняй его теперь.
    Ответ написан
    1 комментарий
  • 'Handler' object is not callable как решить?

    Vindicar
    @Vindicar
    RTFM!
    callback_query_handlers
    Может, всё-таки callback_query_handler?
    Ответ написан
    Комментировать
  • Почему пайтон не видит глобальную переменную?

    Vindicar
    @Vindicar
    RTFM!
    1. Судя по отступам, у тебя get_answer() заканчивается на строке answer = input("Введите слово: ")
    2. Прежде чем упоминать переменную как глобал, она должна быть глобально определена, т.е. ей должно быть присвоено значение вне функции.
    3. Нафига тут вообще глобальная переменная?
    Ответ написан