Задать вопрос
Ответы пользователя по тегу Python
  • Как работает асинхронность в пайтон?

    Vindicar
    @Vindicar
    RTFM!
    asyncio - это, скорее, как обойтись без многопоточности.
    Она хорошо работает для ситуаций, когда большая часть времени потока выполнения уходит на ожидание ввода-вывода - например, на ответ по сети. Если у тебя есть что-то, что занимает CPU, или любая другая операция, выполняемая вне рамок ввода-вывода через asyncio - это остановит выполнение асинхронной программы.
    Если на пальцах, то асинхронная программа состоит из отдельных корутин. Разница с потоками в том, что потоки переключает ОС, а корутины сами отдают управление, когда уходят в ожидание события (грубо говоря, когда делают вызов с await). Это упрощает синхронизацию корутин, так как ты точно знаешь, когда твоя корутина отдаст управление - меньше шансов налететь на состояние гонки из-за внезапного переключения. Опять же, переключение корутин куда более детерминировано, чем переключение потоков, так что "плавающие" баги встречаются реже.
    Тело асинхронной программы - это рабочий цикл (т.н. реактор, он же loop), который проверяет выполняемые операции ввода-вывода, и возобновляет выполнение корутины, когда её операция завершилась. Когда корутина завершится или запланирует ещё одну операцию, она вернёт управление в цикл. Вот почему "задумавшаяся" корутина остановит всю программу.
    Минус в том, что в отличие от многопоточности, нельзя просто вжжжжжжух и сделать код асинхронным. Он должен писаться как асинхронный с самого начала, с прицелом на исполнение в реакторе.
    Ответ написан
    2 комментария
  • Как в функцию передать фильтр, сработавшего хендлера?

    Vindicar
    @Vindicar
    RTFM!
    Ну наверно посмотрить, что доступно в параметре state?
    Ответ написан
    Комментировать
  • Как добавить возможность передавать коду другие файлы и каталоги прямо в командной строке?

    Vindicar
    @Vindicar
    RTFM!
    " Ещё одним возможным улучшением была бы возможность передавать сценарию другие файлы и каталоги прямо в командной строке. Эти имена можно получать из списка sys.argv и добавлять к нашему списку source при помощи метода extend класса list."

    Выделение моё.

    А вообще, sys.argv хранит список параметров командной строки. 0й всегда содержит путь и имя исполняемого скрипта, а вот последующие задаются пользователем.
    В простых случаях можете просто работать с sys.argv как со списком, но если у вас что-то более сложное (типа необязательных аргументов), то смотри в сторону argparse.
    Ответ написан
    Комментировать
  • Ошибка TypeError: sequence item 0: expected str instance, dict found что делать?

    Vindicar
    @Vindicar
    RTFM!
    MyFile = open('C:\HP\proverka.txt', 'w')
    MyFile.writelines(persones)
    MyFile.close()

    writelines() ожидает получить на вход массив СТРОК, а ты даёшь массив словарей. Отсюда и ошибка.
    Зачем ты вообще этот фрагмент написал, если чуть дальше у тебя нормальное сохранение в json?
    Ответ написан
  • Как добавить словарь в файл через модуль pickle?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала я бы посоветовал использовать json вместо pickle. pickle даёт бинарную строку, которая нечитаема человеком. Кроме того, как написано большими красными буквами в доках на pickle, он имеет уязвимости, так что ни в коем случае нельзя передавать через него недоверенные данные.

    В коде много кривых вызовов не по делу.
    ff = open(file_name, 'rb')
    baza = {ff}

    Что сиё должно означать вообще? Ты создал множество из одного элемента - файлового объекта ff. Или ты ожидал, что это магически превратит файл в словарь?
    Как правильно:
    import json 
    #оператор with обеспечит закрытие файла, как только управление покинет тело оператора
    #явное указание кодировки подстрахует от получения "кракозябр" на выходе
    #Кодировка utf-8 позволит использовать символы любых алфавитов.
    with open('Список.txt', 'rt', encoding='utf-8') as ff:
        baza = json.load(ff)

    Далее.
    baza.update({users_name.title():users_numbe})
    Зачем? Почему не написать просто:
    baza[users_name.title()] = users_numbe
    Далее.
    f.close
    Ты взял адрес метода close у объекта f. Ты НЕ вызвал метод close. Чтобы метод вызвать, нужно указать круглые скобки. Впрочем, если используешь with, то он вызовет close() за тебя.
    Так что:
    with open('Список.txt', 'wt', encoding='utf-8') as ff:
        json.dump(
            baza, #что записываем
            ff, #куда
            ensure_ascii=False, #не ASCII-строки пишем как есть, без кодирования
            indent="    ", #сделать отступ, не писать всё в одну строку
            sort_keys=True, #отсортировать ключи по алфавиту
        )

    Остальное примерно так.
    Ответ написан
    Комментировать
  • Как создать напоминание в телеграм боте? Напоминалка каждый месяц?

    Vindicar
    @Vindicar
    RTFM!
    0. Ставишь aiogram и читаешь Quick start, чтобы понять, как в целом будет устроен бот.
    1. Создаёшь и ведёшь базу пользователей бота, например, в sqlite3. Как её наполнять, это уже второй вопрос. Также может потребоваться отдельная таблица напомнинаний, но тебе виднее что за напоминания будут.
    2. В боте создаёшь через asyncio.create_task() бесконечную задачу, которая
    - проверяет время
    - если сейчас подходящее время (скажем, полдень, 1е число месяца, плюс-минус 30 секунд), вызывает корутину уведомления пользователей,
    - засыпает на минуту с помощью await asyncio.sleep() (ни в коем случае не time.sleep()).
    3. Корутина уведомления пользователей должна извлекать из твоей базы уведомления, которые нужно отправить и id пользователей, которым эти уведомления нужно отправить (см. доки по sqlite3 как извлекать данные из БД запросом SELECT). Затем для каждого пользователя она должна отправить текст (см. доки по aiogram) и обработать возможное исключение (например, если пользователь заблокировал бота).
    4. Может потребоваться пара обработчиков команд, чтобы добавлять/менять текст напоминаний.
    Ответ написан
  • Как это реализовать в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну простая же задача, на логику.
    У тебя при вводе команды отрабатывает функция Mishka(), а генерируешь случайный вариант ты вне её, один раз.
    Внеси случайную генерацию внутрь, и будет тебе счастье.
    Ответ написан
  • Как сделать последовательную проверку?

    Vindicar
    @Vindicar
    RTFM!
    Не пиши простыню кода, а разбей задачу на составляющие.
    Для начала отрефактори(переделай) свой код в функцию такого вида:
    def is_guid_accepted(guid: str) -> bool:
        #тут код

    Т.е. функция, которая принимает GUID и возвращает либо True (подтверждён), либо False (не подтверждён). При ошибке можешь выбрасывать исключение, или тоже возвращать False.

    После этого задача упростится.
    1. Прочитать содержимое .xlsx файла, если так уж хочется эксель (а может, всё же csv? будет проще), вытащить из него список GUID'ов и task_id. Гуглится.
    2. Для каждого GUID в списке вызвать функцию выше.
    3. Если функция вернула True, то добавить task_id в список успешных.
    4. Для каждого task_id в списке успешных отправить оповещение. Тебе виднее, как.
    Ответ написан
    1 комментарий
  • Почему телеграм бот долго реагирует на команды?

    Vindicar
    @Vindicar
    RTFM!
    async with pool.acquire() as conn:
    async with conn.cursor() as cursor:

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

    Vindicar
    @Vindicar
    RTFM!
    Ну так и примени. Вставь определение вопроса внутрь t() и замени отправляемый текст на содержимое question.
    Ответ написан
    Комментировать
  • Как создать баркод?

    Vindicar
    @Vindicar
    RTFM!
    Вряд ли какая-то библиотека для создания штрихкодов это позволяет.
    Так что генерируй штрихкод как умеешь, а потом вставь его в большее изображение с помощью Pillow.
    Ответ написан
    Комментировать
  • Как восстановить подключение к сокету python?

    Vindicar
    @Vindicar
    RTFM!
    Пересоздай сокет client?
    Ответ написан
    Комментировать
  • Как сделать так что бы Socket не стопорил цикл?

    Vindicar
    @Vindicar
    RTFM!
    Есть разные способы. Можно получать данные в отдельном потоке, но это несёт свои проблемы, и довольно много.

    Я бы посоветовал освоить использование select() - эта функция позволяет узнать, есть ли в сокете непринятые данные, прежде чем пытаться их принять.

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

    Vindicar
    @Vindicar
    RTFM!
    Перефразирую - нужно удалить из списка все элементы, для которых существует хотя бы один другой элемент с совпадающими N последними символами. Так?
    Используй collections.Counter.
    l1 = ['Ивановы', 'Петровы', 'Сидоровы', 'Груши', 'Яблоки', 'Стол', 'Машина', 'Лампа', '940345']
    N = 2
    suffixes = collections.Counter( item[-N:] for item in l1 )
    l2 = list( filter( lambda item: suffixes[item[-N:]] <= 1, l1 ) )
    Ответ написан
    6 комментариев
  • Некорректно передаться данные с сервера на клиент, в чём причина?

    Vindicar
    @Vindicar
    RTFM!
    ну для начала стоит закрыть файл... лучше всего - через оператор with.
    def install():
        with open("starting.exe", "wb") as file:
            data = client.recv(1024)
            while data:
                file.write(data)
                data = client.recv(1024)

    Далее, как клиент поймёт что всё было передано? По закрытию соединения?
    Так тогда сервер должен корректно закрыть это соединение и дать клиенту понять, что больше данных не будет!
    user.shutdown(socket.SHUT_RDWR)
    user.close()
    Ответ написан
  • TypeError: 'TextChannel' object is not iterable?

    Vindicar
    @Vindicar
    RTFM!
    for message in channel:

    Внезапно, так делать нельзя. Кури метод history().
    Ответ написан
  • Поможете создать текстовый квест на python?

    Vindicar
    @Vindicar
    RTFM!
    Так.
    Но когда дело дошло до переделывания структуры программы - > начались проблемы с не знанием символов, операторов, логических уровней python

    Во-первых, нужно освоить азы языка. Порешайте простые упражения, освойте ветвления, циклы, функции, азы классов. Этого хватит.
    текстовый квест

    Во-вторых, стоит освоить идею конечного автомата (state machine). Это реально очень просто.
    Как освоишь, поймешь, что твой квест - это кучка параллельно работающих конечных автоматов. Один описывает локации мира, другие - состояния отдельных квестов (не начат, находится на том или ином этапе, готов к сдаче, сдан, провален).
    Важный вывод: тебе потребуется как-то хранить эти автоматы так, чтобы к любому из них можно было удобно обратиться из любого места!
    В третьих, осваиваешь State Pattern. Он может пригодиться для реализации мира. По сути, у тебя разные локации будут разными состояниями, и каждая из них может быть представлена как отдельный объект, реагирующий на действия пользователя. Реакция заключается в дергании других автоматов (например, не пускать, пока не пройден квест, или инициировать квест по входу в локацию) и в выводе текста.
    Ты можешь описывать разные локации как разные классы или как разные объекты одного класса.
    Первый подход проще с точки зрения кода, но гораздо более громоздкий, так как на каждую локацию придётся отдельный класс.
    Второй подход сложнее с точки зрения кода, но классов будет меньше, а локации будут представлены данными.
    Я бы начал с первого подхода, чтобы освоиться.
    В-четвёртых, тебе потребуется хранить состояние игрока (и возможно других мобов). Это простые классы, или даже просто словари (dict). Я бы всё же сделал классы.

    Тогда у тебя в программе будет три основных блока.
    1. Интерфейс - кусок кода, который показывает пользователю текующее состояние игры и принимает его ввод, а потом отдаёт этот ввод текущему состоянию игры.
    2. Хранилище автоматов. В первую очередь это автомат навигации по миру, но также и автоматы квестов. Можешь сделать его просто словарём с ключами-строками - так бдует проще.
    3. Данные игрока. Лучше хранить в отдельном классе, но автоматы должны иметь к нему доступ, так или иначе.
    Ответ написан
    2 комментария
  • Как исправить ошибку при создании файла?

    Vindicar
    @Vindicar
    RTFM!
    Если в тексте может быть юникод, то нужно задать кодировку при открытии файла, например, encoding='utf-8'. См. open().
    Ответ написан
    Комментировать
  • Не работает очередь вопроизведения музыки у дискорд бота, что делать?

    Vindicar
    @Vindicar
    RTFM!
    vc.play(source, after = toggle_next)
    await songs.put(vc.play)

    Ты запускаешь воспроизведение вызовом метода vc.play(), а потом помещаешь в очередь ссылку на этот метод.
    Что, по-твоему, сиё должно делать? Потому что оно явно этого не делает, и делать не будет.
    Ответ написан