Ответы пользователя по тегу Python
  • Как исправить баг 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!
    Если тебе нужно, чтобы запущенные потоки доработали до конца даже при завершении программы - то можно их просто запустить и оставить.
    Сложности обычно начинаются, когда нужно завершить фоновый поток вместе с главным - фоновый поток должен сам проверять, что пора завершаться, и делать это достаточно часто.
    Ответ написан
    Комментировать
  • Логика работы Python?

    Vindicar
    @Vindicar
    RTFM!
    Логика предельно простая - на момент обращения к элементу он должен быть определён.
    Простой пример:
    def func_B(s):
        print('B says:')
        func_A(s)
    
    def func_A(s):
        print('Hello from A to', s)
    
    func_B('the world')


    Данный код отработает. Почему, ведь func_A() описана после её вызова в func_B()?
    Потому что поиск этой функции произойдёт в момент вызова func_B() - а тогда функция func_A() уже будет определена.

    А вот тут поменять местами не получится:
    DEFAULT = 'world'
    
    def func_C(s = DEFAULT):
        print('Hello,', s)

    Потому что обращение к DEFAULT происходит в момент определения func_C(), а не в момент её выполнения.
    Ответ написан
    1 комментарий
  • Как поменять 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, которая, разумеется, пропадает, когда обработчик завершается.

    Ну и да, я исхожу из того, что у тебя дальше есть код по запуску бота, которому ты привязал этот обработчик.
    Ответ написан
    Комментировать
  • Какова верная реализация множественного выбора в SQLite через LIKE и REGEXP (Python)?

    Vindicar
    @Vindicar
    RTFM!
    заглавные буквы идут в кодовых таблицах подряд. По идее, будет достаточно что-то типа:
    WHERE substr(word, 1, 1) BETWEEN 'A' AND 'Z'
    если таблица word меняется нечасто, добавь в неё отдельный столбец, содержащий первую букву, и сделай индекс по нему. Может значительно ускорить дело.
    Ответ написан
    1 комментарий
  • Как получить сообщение, на которое ответил пользователь?

    Vindicar
    @Vindicar
    RTFM!
    А зачем ты делаешь get_message(), если message.reply_to_message уже должен содержать информацию о сообщении, на которое был сделан ответ?
    Ответ написан
  • Как записать в переменную упоминание пользователя(в Python)?

    Vindicar
    @Vindicar
    RTFM!
    Упоминание где, блин?

    Если в параметрах команды, то достаточно поставить типом параметра discord.Member.
    Ответ написан
  • Как сложить воедино все символы кроме первого после переделки в list?

    Vindicar
    @Vindicar
    RTFM!
    Ботописатель... я тебе секрет скажу.
    prefix = "!"
    s = "!ping"
    if s.startswith(prefix):
        command = s[len(prefix):]  # срезы в питоне? не, не слышал
        print('Команда', command)
    else:
        print('Это не команда')

    Секрет
    Сначала выучи основы языка, потом разберись как работают сетевые приложения, и только потом пиши ботов. Иначе так и будешь глупости писать.
    Ответ написан
    1 комментарий