Задать вопрос
Ответы пользователя по тегу Python
  • Json ключ value не парсится?

    Vindicar
    @Vindicar
    RTFM!
    Ну наверно нужно не цикл вкладывать в try, а наоборот?
    Ответ написан
  • Можно ли прервать 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!
    Ищи инфу по 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. Нафига тут вообще глобальная переменная?
    Ответ написан
  • Как цифру в строке преобразовать в числовой формат?

    Vindicar
    @Vindicar
    RTFM!
    Затем все приводится к формату строки типа ключ=значение

    Как можно значение оставить типа float?


    Во-первых, определись, о чем всё-таки речь - о формате, или о типе данных? Это разные вещи.
    Если о формате, что читай, как форматировать значения в f-строках.
    Если о типе, то ты просишь превратить число в строку, но оставить его числом. Т.е. взаимоисключающие вещи.
    "Нарисуйте семь перпендикулярных красных линий, но из них три синие должны быть параллельны, а ещё две - прозрачные."
    Ответ написан
    4 комментария
  • Как запустить выполнение асинхронной функции с определенной частотой выполнения?

    Vindicar
    @Vindicar
    RTFM!
    Храни в asyncio.Queue очередь запросов к API. Отдельная задача пусть выбирает запросы из очереди, отправляет, получает ответ и оповещает о результате. Например, так.
    import asyncio
    import typing
    
    class ThrottledResource:
        def __init__(self, delay: float):
            self._delay = delay
            self._queue = asyncio.Queue()
            self._task = None
        
        def start(self):
            self._task = asyncio.create_task(self._work_loop)
        
        def stop(self):
            self._task.cancel()
            self._task = None
    
        # этот метод вызывается клиентским кодом, получает параметры и возвращает отклик спустя время.
        async def query(self, params):
            future = asyncio.Future()  # Future просигналит, когда наш запрос будет обслужен
            await self._queue.put((future, params))
            result = await future  # корутина спит, пока запрос не обслужат
            return result
    
        async def _work_loop(self):
            while True:
                future, params = await. self._queue.get()  # ждем, пока не придёт запрос
                try:
                    result = await call_api(params)  # тут делаем асинхронное обращение к сервису
                except Exception as err:
                    future.set_exception(err)  # была ошибка - теперь await future выкинет исключение
                else:
                    future.set_result(result)  # полуен результат - await future вернёт его
                self._queue.task_done()  # каждому успешному get() соответствует task_done()
                asyncio.sleep(self._delay)  # можно учесть, сколько времени делался запрос. Но стоит ли?

    Код примерный, но идею передаёт. Использоваться будет как-то так
    api = ThrottledResource(delay=1.0)
    api.start()
    ...
    result = await api.query(params)  # await подождёт, пока не дойдёт очередь до нашего запроса


    Нужно добавить обработку ошибок, корректное завершение работы при наличии задач в очереди, и так далее.
    Технически вместо класса можно было реализовать это всё в виде декоратора над replier(), но это уже на вкус и цвет.
    Ответ написан
    6 комментариев
  • Почему пайчарм даёт ошибку, но когда делаю то, что он просит опять ошибка?

    Vindicar
    @Vindicar
    RTFM!
    @bot.callback_query_handler(func=lambda call: True)
    def work(call):


    Не надо описывать обработчики внутри других обработчиков. Это не будет работать так, как ты этого ожидаешь. Однажды прописанный, обработчик остаётся до конца работы программы.
    И уж ТОЧНО не нужно делать самому вызов work(call).
    Ответ написан
  • Могу ли я сделать блокировщик сайтов без использования файла "Hosts" и его изменения?

    Vindicar
    @Vindicar
    RTFM!
    Поднять свой как-бы DNS сервер на машине, прописать этот DNS сервер как основной и единственный для данной машины, предыдущие прописанные сервера сохранить. Админские права на этом этапе понадобятся.
    При поступлении запроса проверять запрашиваемое имя. Если не в чёрном списке - перенаправлять запрос на сохранённый DNS, полученный ответ отдать самому.
    Грубо и не всегда надёжно (есть DNS over HTTPS, например, который так не перехватишь), но в базовом варианте сработает.
    Ответ написан
    Комментировать
  • Как записать for, if-else в одну строку?

    Vindicar
    @Vindicar
    RTFM!
    Если я верно понял, что требуется...
    [(even, uneven)[arg % 2].append(arg) for arg in args]
    Ответ написан
    3 комментария
  • Не понимаю суть ошибки, можете объяснить?

    Vindicar
    @Vindicar
    RTFM!
    from sqlite import db_start, create_profile, edit_profile
    from main import balance


    main импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который импортирует sqlite, который импортирует main, который ...
    Ну ты понял.

    Быстрого волшебного решения тут нет. Разбирайся с областями видимости, избавляйся от глобальных переменных.
    Например, почему у тебя при создании нового профиля используется balance? Т.е. новый пользователь получает столько денег, сколько было у последнего активного?
    Почему вообще у тебя вещи, специфичные для одного пользователя, лежат то в глобальных переменных, то в данных машины состояний (state)? Бери их из БД , когда они потребуются.
    Ответ написан
    6 комментариев
  • Как решить ошибку RuntimeWarning: Enable tracemalloc to get the object allocation traceback?

    Vindicar
    @Vindicar
    RTFM!
    Выше же RuntimeWarning: coroutine XXXXX was never awaited.
    await позабывал. Читай документацию на методы, которыми пользуешься, чтобы знать, как их запускать.
    Ответ написан
    Комментировать
  • Как можно реализовать обработку текста?

    Vindicar
    @Vindicar
    RTFM!
    Читай про finite state machine (FSM) в aiogram.
    Если коротко, надо отслеживать и хранить, в каком меню находится каждый пользователь.
    Ответ написан
    Комментировать
  • Как проверить ячейку бд на наличие конкретных данных Sql?

    Vindicar
    @Vindicar
    RTFM!
    Не стоит полагаться на возвращаемое значение cursor.execute().
    Выхлоп твоего запроса нужно получать через fetchone()/fetchall(), даже если запрос вернул одно значение.
    У тебя тогда в выдаче будет одна строка с одним столбцом. Выбираешь строку через fetchone(), у полученного значения берёшь нулевой столбец.
    Ответ написан
    Комментировать