Ответы пользователя по тегу Python
  • Как сравнивать две строки, имеющий разные "шрифты"?

    Vindicar
    @Vindicar
    RTFM!
    Нормализация юникода - вещь малоприятная.
    Первый термин для гугла - гомоглиф (homoglyph), т.е. символы, которые выглядят очень похоже (типа русской и латинской о). Для питона вроде есть одноименная библиотека, но я сам с ней не работал.
    Ответ написан
    Комментировать
  • Aiogram - как отправить аудио файл gTTS без сохранения на диск?

    Vindicar
    @Vindicar
    RTFM!
    Ты спрашиваешь как сохранить выхлоп gTTS в объект BytesIO, или как отправить содержимое BytesIO через телегу?
    Потому что если первое, это есть в документации на gTTS.
    Ответ написан
    1 комментарий
  • Как правильно список загрузить в базу данных MySQL через Python?

    Vindicar
    @Vindicar
    RTFM!
    Код в примере ожидает список из кортежей по два элемента.
    Список на скриншоте состоит из одиночных строк. Так что либо данные кривые, либо вы не в тот запрос их подаёте.
    Ответ написан
  • Как реализовать отправку уведомлений ботом при соблюдении условий?

    Vindicar
    @Vindicar
    RTFM!
    Еще один человек бросился писать ботов, не озаботившись изучить азы асинхронного программирования.

    Если очень коротко: пока твой код делает что угодно кроме await-вызова, остальной бот стоит.
    То есть:
    time.sleep(10) - весь бот стоит и спит 10 секунд
    await asyncio.sleep(10) - текущая корутина стоит и спит 10 секунд, но в это время могут выполняться другие корутины. Например, реакция на внешние события.

    Что это тут у нас?
    while True:
                schedule.run_pending()
                time.sleep(1)

    Мало того, что бесконечный цикл, так ещё и ожидание делаешь через time.sleep(), который про асинхронность не знает.

    И далее. А на кой овощ тебе вообще использовать schedule, если тебе требуется простое периодическое действие? Особенно с учётом того, что schedule - это тоже синхронная библиотека. Т.е. ты из асихронного бота вызывает синхронный код schedule, а потом оттуда будешь вызывать асинхронные методы отправки сообщений? Хороший способ усложнить себе жизнь!

    async def check_if_notifications_are_needed(self):
        pass
    #а ниже будет что-то типа
    async def run_check(self):
        while True:
            await self.check_if_notifications_are_needed()
            await asyncio.sleep(3600) #серьезно, зачем проверять каждые 5 секунд если достаточно раз в час?
    Ответ написан
  • Как тут сделать insert?

    Vindicar
    @Vindicar
    RTFM!
    Akina, Глеб Лукашонок, пожалуйста, не собирайте SQL запросы с помощью форматирования строк без крайней на то необходимости.

    Используйте placeholders, и да пребудет с вами Бобби Тейблз.
    cur.execute("insert into d_commands (executor, text, phis_addr) values (?, ?, ?)", (1, str(action), -1062731554))

    В этом случае экранирование будет выполнено автоматически, без риска что вы забудете это сделать.
    Ответ написан
  • При запуске бота выдает ошибку AttributeError: 'NoneType' object has no attribute 'create_task' как исправить?

    Vindicar
    @Vindicar
    RTFM!
    dp.loop.create_task(get_channels())
    На момент этого вызов диспетчер еще не начал работу, поэтому его рабочий цикл (loop) отсутствует. Я полагаю, create_task() нужно вызывать внутри какого-либо обработчика события, тогда можно быть уверенным, что рабочий цикл уже запущен.
    Если API aiogram имеет событие, срабатывающее при подключении к сети, обработчик этого события будет подходящим местом.
    Ответ написан
  • Как сделать свойство объекта используемым по умолчанию в Python как в VBA?

    Vindicar
    @Vindicar
    RTFM!
    Магические методы помогут.
    Это не "свойство по умолчанию", а скорее "определение смысла операции для данного объекта", но итоговый результат будет примерно тот же.
    Также можно использовать методы __int__(), __float__() и __complex__() чтобы прозрачно преобразовать объект в число. Но обычно __add__() сотоварищи куда практичнее.
    Ответ написан
    1 комментарий
  • Почему зависает метод put?

    Vindicar
    @Vindicar
    RTFM!
    Возможно, очередь переполнилась.
    Простой способ это обойти: ты знаешь, сколько заданий было дано дочерним процессам. Читай ответы из очереди и считай их. Когда прочитаешь столько ответов, сколько было дано заданий - можно дальше не читать.
    Ответ написан
    Комментировать
  • Есть ли другие способы хранения данных?

    Vindicar
    @Vindicar
    RTFM!
    Если значение связано с конкретным пользователем, используй простой файл в профиле пользователя.
    Если значение связано с конкретной установкой, и у тебя точно есть права на запись в каталог твоей программы (например, она портативная), используй простой файл в каталоге программы.
    Если планируешь запускать программу только на Windows, можно использовать реестр.

    Формат файла зависит от того, насколько вероятно расширения набора хранимых данных, и какие данные планируешь хранить.
    Одно значение (любое) - обычный файл, либо как текст, либо как бинарные данные.
    Примитивные типы (строки, числа, логика) - cfg файл, модуль configparser.
    То же плюс списки и словари - json файл, модуль json.
    Древовидная иерархия, смесь примитивных типов данных с небольшими порциями бинарных - модуль pickle.

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

    А вот если у тебя иерархия объектов данных не дерево, а граф (особенно если есть отношения многие ко многим) - без БД никуда.

    Так что по описанным тобой условиям - простой файл в каталоге программы подойдёт.
    Ответ написан
    Комментировать
  • Как сделать чтобы сообщение Telegram обновлялось пока выполняется другой скрипт?

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

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

    Vindicar
    @Vindicar
    RTFM!
    Это многопроцессность, а не многопоточность. Разница ОЧЕНЬ значительная, так как у разных процессов разные адресные пространства, и данные между ними приходится пересылать с сериализацией через pickle.

    Так что функции, которые выполняются в другом процессе, должны по возможности работать только с примитивами Питона, а также списками и словарями. Я не уверен, как оно работает с вложенными функциями...
    Ответ написан
    Комментировать
  • Как сделать достижения в асинхронном боте телеграм(aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    Грубо говоря, для асинхронной программы верно одно утверждение: "пока ты выполняешь код, не являющийся await вызовом, остальная программа простаивает".
    Каждый await вызов (а также его завершение) - это повод переключиться на другую задачу.
    Таким образом, бесконечный цикл - это просто:
    while True:
      await asyncio.sleep(5) #пока текущая корутина спит, остальной бот работает
      do_stuff() #пока do_stuff() работает, остальной бот спит

    Вопрос в другом: нужен ли бесконечный цикл?
    Я бы посоветовал начать с создания системы сбора статистики.
    Например, завести таблицу вида id юзера - имя статы - значение статы.
    Скажем "id - число_сообщений - 100500". И в обработчиках соответствующих событий делать UPDATE на эту таблицу. А потом в отдельном модуле периодически проверять статы пользователей, проверять, есть ли у них уже ачивка за эту стату, и если нет - то давать.
    Ответ написан
  • Как исправить код?

    Vindicar
    @Vindicar
    RTFM!
    commands = {
            'Привет' in message: say_message("Здравствуйте, сэр!"),
            'как дела' in message: say_message('Всё отлично, у вас?'),
            "всё хорошо" in message: say_message("Это отлично"),

    Если бы выучил азы Питона перед тем как делать ботов по видосикам, знал бы, что так словари не работают. Ты можешь сделать немного по другому, если очень хочется:
    commands = [
    ( (lambda text: 'привет' in text), 'Добрый день!'),
    ( (lambda text: 'пока' in text), 'До свидания!'),
    ]
    #используем так:
    for predicate, response in commands:
      if predicate(message):
        say_message(response)
        break
    else: #else относится к for, сработает если не было break, т.е. не нашли команду
      say_message("Моя твоя не понимает")

    Или можешь попробовать воспользоваться вот этим моим ответом.
    Ответ написан
    2 комментария
  • Конвертировать str to dict?

    Vindicar
    @Vindicar
    RTFM!
    Если используешь requests, то получфаешь данные по HTTP. А значит там не питоновский словарь, там JSON. Они похожи, но не одно и то же!
    Используй модуль json.
    Ответ написан
    Комментировать
  • Вывод всех введённых чисел, кроме 0, но ввод можно продолжить и после 0. Не понимаю: как решить?

    Vindicar
    @Vindicar
    RTFM!
    Вместо input() читай из sys.stdin как из текстового файла?
    import sys
    for line in sys.stdin:
      ... #обрабатываешь введённую строку

    В винде можно в консоли нажать ctrl-z, Enter, это будет сигнал "конец стандартного ввода". Это будет как-бы конец файла, и цикл for прервётся.

    Соответственно, просто делаешь логический флаг "был введён 0" (по умолчанию сброшен), и пока он сброшен - повторяешь введённые числа. Когда он выставлен - не повторяешь. Если пользователь ввёл 0 - выставляешь этот флаг.
    Ответ написан
    Комментировать
  • Как отправить изображение используя socket?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, выучи разницу между TCP (SOCK_STREAM) и UDP (SOCK_DGRAM).
    В последнем случае у тебя НЕ ГАРАНТИРУЕТСЯ ни факт доставки сообщений, ни их правильный порядок, да и на размер сообщения есть ограничения. Также сервер без понятия, когда клиент закончил отправку сообщений.

    Так что лучше разберись, как установить (и корректно закрыть!) TCP соединение и перепиши скрипт на него.
    Ответ написан
  • Можно ли проконтролировать наступление времени?

    Vindicar
    @Vindicar
    RTFM!
    Правильным решением было бы использование планировщика ОС (cron в Linux, планировщих задач в Windows).
    Но если очень надо решение на чистом Питоне, пакет schedule в помощь. Только он требует вечный цикл для работы, так что твой скрипт будет висеть в памяти и жрать проц понемногу. Вот почему советую обойтись средствами ОС.
    Ответ написан
    Комментировать
  • Как экранировать элемент в командной строке (модуль argpars)?

    Vindicar
    @Vindicar
    RTFM!
    Может, проще будет так?
    example.py -genres Romantic -genres Drama

    argparse такое умеет.
    Ответ написан
    Комментировать
  • Можете мне словесно объяснить строку кода python?

    Vindicar
    @Vindicar
    RTFM!
    x = [
        "".join( #6
            [
                "".join( #3
                    [
                        "01"[(i + j) % 2] * k #1
                        for i in range(n) #2
                    ]
                ) + "\n" #4
            ] * k #5
        ) 
        for j in range(n) #7
    ]

    1. Если i + j четное, то генерируем строку из k нулей, иначе из k единиц
    2. Генерируем список из n таких строк, с индексом i
    3. Склеиваем полученные строки без разделителя
    4. В конец приклеиваем перевод строки.
    5. Делаем список из k повторов строки, сгенерированной в ходе 4.
    6. Склеиваем эти повторы без разделителя
    7. Генерируем строки по пп. 1-6 n раз с индексом j и формируем из них список.
    Ответ написан
    Комментировать
  • Как правильно обучить модель нейронной сети?

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

    Для случайных чисел можно разве что попытаться определить распределение для каждой позиции.
    Для временных серий можно попробовать LSTM.
    Ответ написан
    Комментировать