Задать вопрос
Ответы пользователя по тегу Python
  • Как создать многопоточную программу обращающиеся к API?

    Vindicar
    @Vindicar
    RTFM!
    Причём тут конкретно многопоточность?
    Если дело в том, что в нескольких потоках трудно координировать обращения к API, то как выше правильно сказали - делайте очередь запросов (например, queue.SimpleQueue) и отдельный поток, который будет эти запросы выполнять с учётом лимитов.

    Например, так: поток-клиент кладёт в очередь словарь вида
    task = {'ready': threading.Event(), 'params': {...тут параметры запроса...} }
    , а потом делает
    task['ready'].wait()
    if 'error' in task:
        ... # реагируем на ошибку
    else:
        ...  # читаем результат из task['result']

    Тогда рабочий поток, реализующий обращения, будет принимать очередное задание из очереди, делать запрос к API согласно содержимому params, потом записывать результат в task['result'] или ошибку в task['error'] и делать task['ready'].set(), чтобы уведомить клиента о том, что его задание завершено.
    Ответ написан
    5 комментариев
  • Как преобразовать эмбеддинг текста в понятный сверточным слоям?

    Vindicar
    @Vindicar
    RTFM!
    Свёрточные слои работают только с изображениями (ну или с картами особенностей, что частный случай изборажений). Они ищут локальные взаимосвязи между соседними элементами изображения.

    Эмбеддинг изображением не является, в нём нет локальных вазимосвязей между элементами - он имеет смысл только при рассмотрении всех элементов эмбеддинга.

    Таким образом, пытаться скормить эмбеддинг напрямую в свёрточный слой довольно-таки бессмысленно.
    Ответ написан
  • Как правильно обработать exception PasswordHashInvalidError?

    Vindicar
    @Vindicar
    RTFM!
    Огранизовать цикл while True, при вводе правильного пароля (т.е. если не было исключения) делать break.
    while True:
        try:
            attempt_stuff_and_things()
        except SomeException as err:
            react_to_error(err)
        else:  # исключения не было
            break
    Ответ написан
    Комментировать
  • Как в python запустить скрипт из venv?

    Vindicar
    @Vindicar
    RTFM!
    activate нужен, чтобы задать алиас для питона и других утилит из текущего окружения, и ещё парочку переменных среды. Каких - можешь увидеть, открыв скрипт activate.
    Если твой скрипт их не использует, то разницы никакой - можешь просто вызывать питон из .venv/bin/python3 и отдавать ему свой скрипт, и всё будет ок.
    Ответ написан
  • Как поменять тайтл и иконку уведомления в win11toast?

    Vindicar
    @Vindicar
    RTFM!
    Ты вообще документацию читал? Хотя бы страницу пакета на pypi? Там полно примеров, в том числе с иконкой, тайтлом, действием по клику, кнопками и т.д.

    Или ты про имя и иконку приложения, которое открыло уведомление?
    Тогда не удивлюсь, если никак, потому что пользователь должен знать какая сволочь спамит на рабочий стол.
    Разве что упаковывать скрипт в exe с кастомной иконкой и названием.
    Ответ написан
  • Как исправить баг socket подключение к двум и более клиентам паралельно через Thread?

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

    Vindicar
    @Vindicar
    RTFM!
    Мне кажется, ты просто используешь неверный инструмент, пытаясь совместить несовместимое.
    Вариант А
    Ты проверяешь, что у тебя объект нужного типа. Тогда твой декоратор в принципе работает, но вообще-то это задача для статического анализатора кода типа mypy или встроенного в pycharm, а не проверки в рантайме. И тогда нужно забыть про моки.

    Вариант Б
    Ты проверяешь, что у тебя объект имеет нужные поля и методы (duck typing).
    Тогда тебе нужен typing.Protocol в комбинации с typing.runtime_checkable, с помощью которого ты сможешь описать, что должен иметь объект. Затем этот протокол можно будет подсунуть в isinstance() для проверки, и мок, по идее, её пройдёт. Но опять-таки, задача скорее для статического анализатора кода, чем для рантайм-проверки. Если у тебя в принципе неведомо что может быть передано в метод - это простыми тестами не решается.
    Ответ написан
    2 комментария
  • Почему при запуске голосового ассистента он завершает свою работу?

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

    Vindicar
    @Vindicar
    RTFM!
    Как ты отличишь импорт из скрипта от импорта из библиотеки?
    Можно отреагировать на импорт в момент, когда он происходит - но понять, кто его выполнил, тяжело.
    И даже если ты сумеешь через анализ текущего фрейма стека понять, кто вызвал импорт - импортированный модуль будет закэширован, и скрипт потом сможет обратиться к нему через sys.modules. Так что либо запрещать импорт модуля в принципе (например, через аудит хук), либо разрешать его во всём скрипте.
    Ответ написан
    Комментировать
  • Как это работает?

    Vindicar
    @Vindicar
    RTFM!
    f-строки - это способ подставить в строку значение переменной или выражения.
    В фигурных скобках - выражение, чьё значение нужно подставить. После двоеточия идёт указание на то, как это значение вывести.
    Например, f"{i:2d}" означает "выведи значение переменной i как целое число (d), и дополни его пробелами до ширины 2 знака".

    Подробнее в документации на язык, ссылку тебе дали выше.
    Ответ написан
    Комментировать
  • Почему BEFORE и SINCE не работают с числовым значением месяца?

    Vindicar
    @Vindicar
    RTFM!
    Цитата из документации:
    Search mailbox for matching messages. charset may be None, in which case no CHARSET will be specified in the request to the server. The IMAP protocol requires that at least one criterion be specified; an exception will be raised when the server returns an error.

    Иными словами, что тебе вернёт сервер, и как он сообщит (и сообщит ли!) об ошибке - зависит от сервера, либа только оборачивает его ответы в объекты и исключения питона.
    Если сервер решает что "фз что ты ищешь, на, держи всё что есть", то либа это молча и вернёт.
    Ответ написан
    Комментировать
  • Почему auto-py-to-exe долго собирает приложение и что означает TRACE?

    Vindicar
    @Vindicar
    RTFM!
    TRACE - обычно супер-детальные сообщения о ходе работы программы. "Сейчас я делаю вот это".
    Уровень подробности логов обычно настраивается.
    Ответ написан
    2 комментария
  • Изменение ProgressBar по итерациям в функции?

    Vindicar
    @Vindicar
    RTFM!
    Добавь функции ещё один параметр - callback-функцию, которая будет вызываться каждые X итераций.
    Тогда вопрос "как подружить функцию с индикацией прогресса" сведётся к написанию подходящей callback-функции. Условно:
    from time import sleep
    
    def worker(n: int, cb=None):
        for i in range(n):
            sleep(0.2)  # работу работаем
            if cb is not None and i % 5 == 0:
                cb(i, n)  # оповещаем, если пора и если есть что
        if cb is not None:
            cb(n, n)  # последнее оповещение на 100%. можно убрать
    
    # использование
    def callback(i, n):  # callback для вывода прогресса в консоль
        print(f'{i/n:.1%}')  # выводим процент  завершения
    
    worker(50, callback)  # работаем
    Ответ написан
    2 комментария
  • Как сделать функцию в которой в переменной будет много функций?

    Vindicar
    @Vindicar
    RTFM!
    Блок операторов, вынесенный отдельно и именованный - это и есть функция, вообще-то. Читай про ключевое слово def.
    from turtle import *
    
    color("black", "red")
    m = 100
    
    def myfunc():  # мы говорим "существует функция myfunc, не принимающая параметров"
        forward(12*m)  # функция "увидит" переменную m, описанную выше по коду
        right(940)
    
    begin_fill()
    for i in range(4):
        myfunc()  # вызываем нашу функцию
    end_fill()
    canvas = getcanvas()
    cnt = 0
    for y in range(-100*m, 100*m, m):
        for x in range(-100*m, 100*m, m):
            item = canvas.find_overlapping(x,y,x,y)
            if len(item) == 1 and item[0] == 5:
                cnt += 1
    print(cnt)
    done()
    exit()
    Ответ написан
    2 комментария
  • Почему некоторые декораторы жёлтого цвета а "@" голубого цвета на библиотеке disnake?

    Vindicar
    @Vindicar
    RTFM!
    А библиотека и версия питона тут ни причём. Это используемая тобой среда разработки (IDE) так показывает. На работу кода цвет текста в IDE не влияет. =)

    А вот разницу между
    @decorator
    def func():
        ...

    и
    @decorator()
    def func():
        ...

    понимать надо.
    Ответ написан
    7 комментариев
  • Нужно ли (и как) позаботиться о завершении работы нескольких потоков, которые тоже запущены из отдельного потока?

    Vindicar
    @Vindicar
    RTFM!
    Если тебе нужно, чтобы запущенные потоки доработали до конца даже при завершении программы - то можно их просто запустить и оставить.
    Сложности обычно начинаются, когда нужно завершить фоновый поток вместе с главным - фоновый поток должен сам проверять, что пора завершаться, и делать это достаточно часто.
    Ответ написан
    Комментировать
  • Как поменять for i in range на while?

    Vindicar
    @Vindicar
    RTFM!
    Изменяй. Разрешаю.

    Если серьёзно, то учебные задачи надо решать самостоятельно, иначе какой смысл браться?
    Но тут достаточно понимать, что делает for i in range(x): ...
    Это близкий эквивалент такого кода:
    i = 0
    while i < x:
        ...  # тут тело цикла for
        i += 1

    Ответ написан
    Комментировать
  • Как создать свой xml формат?

    Vindicar
    @Vindicar
    RTFM!
    1. Написать класс-реестр, который по имени тега определяет класс компонента.
    2. Написать базовый класс компонента, который умеет читать своё XML описание, выделять из него прописанные атрибуты (типа цвета, текста и т.д.), а также находить и создавать вложенные компоненты, если они есть. Для определения, какой класс нужно использовать для создания компонента, и нужен реестр.
    3. Отнаследовать от базового класса классы для поддерживаемых тобой компонентов. Они должны брать свои атрибуты (которые выделил базовый класс), а потом создавать и настраивать соответствующий элемент управления. Также они должны предоставлять способ подписаться на события, на которые ты хочешь реагировать, типа изменения поля ввода, клика по кнопке и т.д. И, разумеется, они должны быть прописаны в реестре компонентов, чтобы их можно было вкладывать друг в друга.

    Работы вагон, а толку будет немного, но для тренировки можно попробовать.
    Ответ написан
    Комментировать
  • Данные отсутствуют пишет не правильные селекторы?

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

    Запиши скачанную страницу в файл, и посмотри, насколько она похожа на то, что ты ожидаешь получить.
    Ответ написан
    Комментировать
  • Python Telebot. Не сохраняется значение в переменную. Сможете помочь?

    Vindicar
    @Vindicar
    RTFM!
    Читай, как работают глобальные переменные (ключевое слово global) в питоне.

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

    Ну и да, я исхожу из того, что у тебя дальше есть код по запуску бота, которому ты привязал этот обработчик.
    Ответ написан
    Комментировать