Ответы пользователя по тегу Python
  • Почеум при использывании функции click() библиотеки pyautogui курсор не кликает?

    Vindicar
    @Vindicar
    RTFM!
    А ты уверен, что на момент выполнения click() окно браузера уже существует? Сколько времени он открывается?
    И вообще, открывать URL кликом по закреплённой закладке - ну такое себе. Чем тебе webbrowser.open() не угодил?
    Ответ написан
    1 комментарий
  • Атрибуты дочернего класса в родительском?

    Vindicar
    @Vindicar
    RTFM!
    Нет, так как код CacheManager вообще ничего не знает про свои дочерние классы.
    С другой стороны, почему у тебя все методы декорированы staticmethod? Если бы это был classmethod, то тогда при вызове Info.extract метод extract() хотя бы смог бы понять, что его вызывает на классе Info, а не CacheManager.
    Ответ написан
  • Как с Python получить текст из DOCX с сохранением форматирования?

    Vindicar
    @Vindicar
    RTFM!
    Ну смотри. В DOCX текст хранится в виде интервалов (runs), где интервал - это последовательность символов с одинаковым форматированием. Можно получить список интервалов в абзаце через свойство docparagraph.runs.
    А дальше для каждого интервала определяешь интересующие тебя свойства форматирования, достаёшь текст, и имитируешь это форматирование с помощью markdown (ну или какие там ещё языки разметки поддерживает нужный тебе мессенджер). Результаты склеиваешь в одну строку и отправляешь.

    Кое-что есть в документации, но она явно неполная, так что остальное придётся искать в исходниках классов Paragraph и Run.
    Ответ написан
    3 комментария
  • Как удалить пакеты которые не используются в проекте из виртуального окружения?

    Vindicar
    @Vindicar
    RTFM!
    Потому что надёжного метода анализа зависимостей нет.
    Импорты в питоне могут быть условными, выполняться в разное время, или вообще выполняться динамически через importlib.
    Я бы сказал, вспомнить, какие пакеты тебе требуются, очистить окружение, поставить их, погонять приложение и пособирать недостающее.

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

    Vindicar
    @Vindicar
    RTFM!
    цикл for, функция range(), функция time.sleep()
    Ответ написан
    Комментировать
  • Как получать значение атрибута, обращаясь к экзмепляру класса?

    Vindicar
    @Vindicar
    RTFM!
    Есть несколько способов.
    1. Пусть твой класс наследуется от collections.abc.MutableSequence и сам реализует минимально нужный набор методов (__getitem__, __setitem__, __delitem__, __len__, insert). Остальные методы списка MutableSequence реализует за тебя. Разумеется, если твое поле - не список, то нужно будет наследоваться от другого класса.
    2. Если твой класс всегда будет полем другого класса, ты можешь реализовать метод __get__(). Через него работают свойства (property). Но имей ввиду, что в этом случае ты вообще никогда не сможешь обратиться к чему-либо кроме того поля, которое возвращаешь.
    Ответ написан
    Комментировать
  • Как правильно сделать вывод данных из sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Category ID пробелы в именах столбцов - не лучшая идея. У тебя точно толбец так называется? Если да, то оберни имя столбца в `бэктики` (обычно на клавише Ё).
    Ну и да, сдаётся мне, что 'call.data' не будет работать так, как ты это ожидаешь.
    Ответ написан
    Комментировать
  • Progress bar как вывести результат?

    Vindicar
    @Vindicar
    RTFM!
    Оставаясь в рамках стандартного терминала - никак.
    Под никсами для сложного интерфейса в терминале есть ncurses, под виндой придётся искать аналог.
    Я бы сказал, если нужно что-то сложнее print() - осваивай tkinter. Если написать программу с умом, то можно будет сделать гибридное приложение, которое будет показывать GUI при обычном запуске, и работать в консоли при запуске с параметрами. Это если такое требуется, конечно - я фз какой у тебя сценарий использования.

    UPD: есть вариант использовать для вывода прогрессбара stderr, а для вывода результатов stdout, но в терминале они всё равно перемешаются.
    Ответ написан
    Комментировать
  • Как исправить ошибку с регулярными выражениями?

    Vindicar
    @Vindicar
    RTFM!
    Ну так почитай основы.
    Во-первых, используй r-строки, чтобы не натыкаться на проблемы с символом \.
    Во-вторых, изучи зарезервированные символы регулярных выражений, а именно: ( ) [ ] ^ $ . ? * +. Если тебе нужен этот символ как просто символ, его надо экранировать! Т.е. если тебе нужно совпадение с символом ?, надо писать \?.
    В-третьих, для поиска символа из указанного набора используются квадратные скобки, т.е. [abc] совпадёт с одним символом из указанных: a, b или c. Для задания диапазона можно сделать так: [a-z]. Это зачастую короче.
    В-четвёртых, для поиска символа НЕ из указанного набора используется такой синтаксис: [^abc]
    В-пятых, есть заранее заданные наборы. Например, \w описывает словесные символы (буквы, цифры и подчёркивание), \d описывает цифры, и т.д. Аналогично, \W и \D описывают всё кроме словесных символов и цифр, соотв.
    Тогда у тебя будет два варианта
    Если подчёркивание - не проблема:
    re.sub(r'\W', '', 'test:_:test', re.I)  # даст test_test

    Если подчёркивание тоже нужно убрать:
    re.sub(r'[\W_]', '', 'test:_:test', re.I)  # даст testtest
    Ответ написан
    1 комментарий
  • Не работает код ошибки Python Bot?

    Vindicar
    @Vindicar
    RTFM!
    group_members = await bot.get_chat_member(group_id)

    Я подозреваю, что ты хотел вызвать bot.get_chat_members()
    Ответ написан
    Комментировать
  • Почему код не работает асинхронно?

    Vindicar
    @Vindicar
    RTFM!
    async def parse_card(card):
        d = dict()
        # из карточки берется html
        # "вставляется" в объект супа
        # и возвращается словарь
        # внутри этой функции не используются await
        return d


    Ну а ты что хочешь-то? Асинхронность в питоне предназначена для распараллеливания операций ввода-вывода (и сводимых к ним), а не для параллельного выполнения расчётов. У тебя parse_card() всё равно что синхронная.
    Ответ написан
    1 комментарий
  • Как вернуть значение из класса?

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

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема с циклическим импортом: основной файл будет импортировать модули с функциями, но этим модулям будет требоваться экземпляр бота, описанный в основном файле. Эту проблему можно обойти так:
    # submodule_1.py  - модуль, содержащий часть функций бота
    def setup(bot):  
        # bot - объект бота. Можешь добавить и другие полезные параметры, такие как:
        # - объект logging.Logger для журналирования
        # - объект соединения с БД
        # - ну и что там ещё тебе потребуется
    
        # все обработчики событий объявляем ВНУТРИ setup()
        # тогда они смогут ссылаться на переданные параметры
        @bot.command('/start')  # например, чтобы использовать декораторы
        def on_start(message):
            message.reply('foobar')
    # мы описали функцию setup(), но здесь мы её не вызываем!
    
    
    # main.py - основной файл бота
    bot = ...  # создаём объект бота
    
    import submodule_1  # импортируем модуль с функциями
    # при вызове setup() будут заданы обработчики событий, описанные в ней
    submodule_1.setup(bot)  # функции передаём объект бота (и другие объекты, если она их ожидает)
    # функцию setup() нужно вызывать не более одного раза!
    # так можно добавлять столько модулей, сколько требуется.
    
    bot.run()  # дальше бота запускаем как обычно
    Ответ написан
    2 комментария
  • Как обработать исключение в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же прямо написало строку, в которой ошибка.
    chat_member = bot.get_chat_member(id_list_channel[-1], 6276048962)

    И эта строка у тебя НЕ завёрнута в try-except.
    Ответ написан
  • Как вывести сообщения пользователя в бд?

    Vindicar
    @Vindicar
    RTFM!
    @dp.callback_query_handler(text='1')
    async def id1(callback: CallbackQuery):

    Этот обработчик прикреплён к кнопкам в сообщении /start. Поэтому callback.message указывает именно на это сообщение.
    А тебе нужно дождаться следующего сообщения. Читай про finite state machine.
    Ответ написан
    Комментировать
  • При запуске скрипта пишет 'NoneType' object has no attribute 'encode' Check your login or password please! как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    Ну если 31я строка, то разгадка несложная. Ты откуда пароль-то получаешь?
    Через os.getenv(). А если переменная окружения (в твоему случае EMAIL_PASSWORD) не задана, то getenv() вернёт None. Твой код эту возможность не учитывает.
    Ответ написан
  • Как временно хранить кэш в python?

    Vindicar
    @Vindicar
    RTFM!
    Реализуй кэш как отдельную функцию, самостоятельно или через functools.
    def do_stuff_nocache(*args, **kwargs):
        ...
    
    @lru_cache
    def do_stuff(*args, **kwargs):
        return do_stuff_nocache(*args, **kwargs)


    Ну или залезь в кишки lru_cache. Но это плохая идея, так как если ты уберешь декоратор, код сломается.
    @lru_cache
    def do_stuff(*args, **kwargs):
        ...
    
    
    print(do_stuff.__wrapped__(*args, **kwargs))


    Еще можно сделать do_stuff.clear_cache() но это очистит кэш вообще, что, скорее всего, нежелательно.
    Ответ написан
    Комментировать
  • Как получить нажатую реакцию из ЛС бота discord pycord?

    Vindicar
    @Vindicar
    RTFM!
    В документацию к используемой библиотеке? По идее реакции в ЛС обрабатываются точно так же, как реакции на сервере, разницы быть не должно.
    Если ты используешь discord.py, то можешь
    а) попытаться использовать wait_for()
    б) хранить где-то соотношение "id пользователя - id сообщения", и обрабатывать on_reaction_add(). А в обработчике уже смотреть, если данному сообщению сопоставлен ждущий роли пользователь - дать роль.
    Ответ написан
  • Как принимать и обрабатвать ключи типа `-key "value"` в строках?

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

    Vindicar
    @Vindicar
    RTFM!
    Ты объявляешь функцию replay(), но не вызываешь её.
    А вообще, тебе тут нужен цикл, а не рекурсия.
    Ответ написан
    Комментировать