Задать вопрос
  • Как запустить два параллельных процесса бота: бесконечную функцию, проверяющую имеются ли обновления, и обработчики событий и сообщений?

    Vindicar
    @Vindicar
    RTFM!
    Надо хоть немножечко осознавать, как работает asyncio.
    create_task() возвращает объект класса Task, представляющий собой фоновую задачу. Эта задача уже запланирована к выполнению в рабочем цикле (loop) asyncio, и будет выполняться в фоне пока текущая корутина ожидает какой-нибудь другой операции.

    Но если тебе надо дождаться завершения работы задачи, ты можешь сделать await на этом объекте.
    Тогда текущая корутина приостановится, пока задача не завершится, и получит или возвращённое задачей значение, или выкинутое задачей исключение.
    А теперь посмотри на свой код:
    await asyncio.create_task(start_checking_price(1800))

    Ты создаёшь задачу - и тут же говоришь программе, что тебе надо дождаться её завершения!
    Ну как бы программа и делает в точности то, что ты от неё требуешь...
    Подчёркиваю красным: await asyncio.create_task(some_coro(...)) не имеет смысла практически никогда! Если тебе нужно запустить корутину и дождаться результата, делаешь просто await some_coro(...).
    А вот если тебе нужно запустить корутину параллельно текущей... Получится что-то типа такого:
    # ...
        check_task = asyncio.create_task(start_checking_price(1800))  # нету await, мы не ждём созданную задачу!
    
        try:
            await dp.start_polling()
        finally:
            check_task.cancel()  # отменяем корутину
            # внутри start_checking_price() текущий выполняемый await выкинет исключение CancelledError
            # это исключение всплывёт наружу, если мы сделаем await, и позволит отработать 
            # блокам finally, with и т.п. инструментам. Также можно явно поймать это исключение,
            # чтобы обработать отмену корутины. Но в твоём случае это не требуется.
            try:
                await check_task  # даём корутине отработать завершение
            except asyncio.CancelledError:  # ловим всплывшее CancelledError
                pass  # всё ок, никакие действия не требуются
            await my_bot.close()
    Ответ написан
    7 комментариев
  • Как получить экземпляр родителя из дочернего класса?

    Vindicar
    @Vindicar
    RTFM!
    Не надо так делать. Просто не надо.

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

    Vindicar
    @Vindicar
    RTFM!
    Прочитать все записи, разбить строку по разделителю, скормить всё в collections.Counter.
    С pandas не работал, вот пример для списков:
    from collections import Counter
    from itertools import chain
    data = [
      (1, 'old;white'),
      (2, 'old;green'),
      (3, 'old;brown'),
      (4, 'new;green'),
    ]
    # генерирует последовательность ['old', 'white'], ['old', 'green'], ...
    split_generator = (item[1].split(';') for item in data) 
    # генерирует последовательность 'old', 'white', 'old', 'green', ...
    property_generator = chain.from_iterable(split_generator)
    # исправляет регистр и удаляет пробелы - можно убрать, если не надо
    property_fixed_generator = (item.strip().lower() for item in property_generator)
    # поглощает данные из генераторов и считает вхождения
    count = Counter(property_fixed_generator)
    print(count)  # Counter({'old': 3, 'green': 2, 'white': 1, 'brown': 1, 'new': 1})
    Ответ написан
    Комментировать
  • Как указать когда нужна рекурсия а когда нет?

    Vindicar
    @Vindicar
    RTFM!
    JSON не предназначен для структур данных с циклическими ссылками. Вообще-то ты должен был словить исключение в этом случае, а не рекурсию. Очень странно, что этого не произошло.
    Тут есть две возможности:
    1. Задуматься о смысле жизни, а на кой тебе вообще обратные ссылки? Они тебе ТОЧНО необходимы? У тебя есть сценарий, когда у тебя есть ссылка на книгу, но нет необходимой ссылки на полку? Книга должна что-то знать о полке. на которой она стоит? Если без них можно обойтись, удали их. Проще жить будет. Подумай, например, что при перемещении книги с полки на полку ты должен не забыть сменить книге shelf.
    2. Посмотреть на параметр default в json.dump(). Это должна быть функция, которая принимает объект, и возвращает словарь. Ты можешь явно проверять, что объект - один из твоих датаклассов, и удалять из полученного словаря обратные ссылки. Аналогично, у json.load() есть object_hook, который позволяет задать свою логику превращения загруженных из JSON словарей в объекты. Но серьёзно, так ли нужны обратные ссылки?
    Ответ написан
  • Как реализовать Python-код, который будет распознавать речь, но будет реагировать только тогда, когда будет упомянуто определенное слово?

    Vindicar
    @Vindicar
    RTFM!
    Проверяй, содержит ли/начинается ли распознанный текст на определённое слово.
    Как - гуглится, это основы работы со строками в питоне. См. метод startswith() и оператор in. Заодно глянь методы перевода строки в другой регистр типа lower() - может помочь убрать чувствительность к регистру.
    Для начала должно хватить.
    Ответ написан
    Комментировать
  • Выполнение парсинга странцы?

    Vindicar
    @Vindicar
    RTFM!
    Найти на странице ссылку на следующую страницу и взять эту ссылку целиком, вместо того чтобы пытаться синтезировать её самому.
    Ответ написан
    Комментировать
  • Существует ли аналог GPTs?

    Vindicar
    @Vindicar
    RTFM!
    Не, ну ты можешь поиграться с AnythingLLM для реализации RAG и каким-нибудь ПО для собственно запуска языковой модели (Jan или что-нибудь ещё на базе Ollama).
    Но сразу скажу, у меня не вышло добиться толку.
    Ответ написан
    Комментировать
  • Как правильно написать многоуровневое меню для телеграмм бота в библиотеке telebot?

    Vindicar
    @Vindicar
    RTFM!
    Ну первое, что я замечу: в коде только call_start_menu() помечена как обработчик событий от кнопок, потому что только перед ней стоит декоратор callback_query_handler.
    Советую ознакомиться с документацией и примерами, чтобы понять, как регистрируются обработчики.
    А заодно (поскольку это будет ваш следующий вопрос) понять, что такое func= и для чего оно нужно.
    Ответ написан
    1 комментарий
  • Как SQL запрос переделать для sqlalchemy?

    Vindicar
    @Vindicar
    RTFM!
    По-моему, у тебя перепутаны скобки в stmt = ...
    stmt = select(Book).where(
      or_(
        Book.name.ilike(":message")
      ),   # тут or_ закончился
      (  # а тут уже фз что пошло...
        Book.author_name.ilike(":message"), 
        (
          Book.author_lastname.ilike(":message")
        )
      )
    )  # тут закончился where
    Ответ написан
  • Как сделать чтобы всё в windows 11 пропускалось через proxy?

    Vindicar
    @Vindicar
    RTFM!
    Только ставить клиент впн на комп, чтобы он завернул траффик на себя. Или использовать телефон как единственный источник инета, и завернуть весь раздаваемый трафик в впн.

    Есть, конечно, варианты типа proxify, но с ними нужно экспериментировать.
    Ответ написан
    Комментировать
  • Куда указывает ошибка AttributeError: 'Bot' object has no attribute 'row' (Pycord)?

    Vindicar
    @Vindicar
    RTFM!
    Да, ты чего-то не понимаешь. Почему у тебя не вызвал вопросов вот этот код?
    def __init__(self, bot):  # раз конструктор
        self.bot: commands.Bot = bot
    
    def __init__(self, *args, **kwargs):  # два конструктор ?!?!?!
        super().__init__(*args, **kwargs, title="Подача запроса")
    Ответ написан
  • Как исправить ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Вариант 1: Ты уверен, что запускаешь свой скрипт, используя правильное окружение?
    Что, если запустить скрипт, явно используя питон из окружения? Например,
    /путь/к/твоему/проекту/venv/bin/python3 твой_скрипт.py

    Вариант 2: имя пакета и имя импортируемого модуля могут не совпадать.
    Ответ написан
    Комментировать
  • Что не так с кодом Python?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты неверно понимаешь логику своей программы.
    Если у тебя не найдётся 1.png, вылетит исключение, и даже не будут попытки искать дальнейшие картинки - управление перейдёт в except, а затем на новую итерацию while True, где снова будет попытка искать 1.png.

    Есть и ещё ряд замечаний.
    1. На кой баклажан ты загружаешь 1.png-5.png на каждой итерации цикла? Только зря программу замедляешь. Если ты не хочешь обновлять эти файлы без перезапуска программы, то загрузи их один раз на старте.
    2. То же самое со скриншотом. Ты делаешь новый скриншот перед каждым следующим файлом - это точно хорошая идея? Вроде как надо поискать изображения на скриншоте, и только потом делать следующий.
    3. Почему ты используешь И locateOnScreen(), И matchTemplate()? Выбери ту функцию, которая лучше работает, и используй только её.
    4. Ты нифига не отслеживаешь, а что за исключение-то вылетает? Может, у тебя программа в принципе кривая, и дело не в том, что изображение не найдено. Для locateOnScreen() лови конкретно pyautogui.ImageNotFoundException. matchTemplate() исключений не кидает, так что проверяй, что locations не пуст, а имеет хотя бы один элемент. А остальные эксепшены не лови, или хотя бы выводи инфу о них в журнал работы программы.
    Ответ написан
    8 комментариев
  • В функции four_squares программа выдает ошибку как только обращается, и почему не проходит тест с этим числом 106369249365575352836589875696130383747?

    Vindicar
    @Vindicar
    RTFM!
    В питоне встроенный int поддерживает длинную арифметику, поэтому с ним можно выполнять операции даже если операнды превышают 64 бита. Но это, разумеется, медленнее, чем аппаратно-поддерживаемое число.
    Ответ написан
  • Возможно ли соединить работающий java код и так же работающий скрипт python?

    Vindicar
    @Vindicar
    RTFM!
    В принципе - конечно, возможно.
    Если один из скриптов запускает другой, через стандартный ввод/вывод.
    Если работаешь под Linux - через unix-сокет.
    Можно организовать общую область памяти через отображение файла на память (но это рискованный трюк, тут лучше использовать как можно более примитивные структуры данных).
    Ну или наиболее прямолинейное (но, возможно, чуточку более медленное) решение - через обычный сетевой сокет.

    Во всех случаях тебе придётся как-то сериализовывать свои данные на стороне отправителя, и десериализовывать на стороне получателя.
    Ответ написан
    1 комментарий
  • Как отправить разные изображения для сообщений с одинаковым содержанием в Telebot?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужен автомат состояний (finite state machine, FSM). Не знаю, есть ли его реализация в комплекте с telebot, но идея простая: нужно помнить, что пользователь делал раньше, т.е. иметь хранилище ключ-значение вида "id пользователя -> состояние+доп. инфа". В простейшем варианте хватит и словаря (если тебе не критично, чтобы сведения переживали перезагрузку бота).
    Ответ написан
    Комментировать
  • Как определить размер и координаты любого окна python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ для винды - с линуксовыми оконными менеджерами я дела не имел.
    Можно посмотреть на видимый заголовок окна или на т.н. строку класса окна. Возможно, pyautogui или pywinauto могут найти окна по заголовку.
    Более сложные и надёжные решения требуют работы с WinAPI: в принципе можно найти окна, принадлежащие процессу с заданным экзешником, уточнить через заголовок/класс окна, а дальше получить их позицию.
    Проблема в том, что до WinAPI надо достукиваться через модуль ctypes, а значит, нужно уметь не только Питон, но и хотя бы основы C или C++. Я могу описать этот вариант подробнее, если захочешь связываться с этой канителью.
    Ответ написан
    Комментировать
  • Почему ответ из request, появляется только после того как зашёл сайт, с которого и пытаемся получить ответ через запрос, а так он пуст?

    Vindicar
    @Vindicar
    RTFM!
    Потому что сайт трекает кто заходит? "Ага, это вроде действительно браузер... считаем этот IP человеком на ближайшие N минут."
    Ответ написан
  • Как рисовать поверх фото в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Вместо того, чтобы изобретать велосипед, используй элемент Canvas. Он и рисовать позволяет, и изображение вставить.
    Ответ написан
    Комментировать