Задать вопрос
Ответы пользователя по тегу Python
  • Traceback (most recent call last), как исправить?

    Vindicar
    @Vindicar
    RTFM!
    У тебя парсер строку
    name = data_acquisition("Enter your name: ")
    разбирает как
    name = data_acquisition  <-- присваивание
    ("Enter your name: ") <-- какой-то левый код

    или поработай над приоритетом правил, или тщательнее определяй конец оператора.
    Сейчас ты игнорируешь концы строк, а зря. Если у тебя синтаксис питоно-подобный, то они значимы.
    Ответ написан
  • Как добавить пробелы между абзацами?

    Vindicar
    @Vindicar
    RTFM!
    Не делать тупо .get_text(), а перебирать содержащиеся внутри теги (скорее всего будут <p> или <div>) по одному, извлекать текст уже из них, и вставлять после каждого тега символ - например, перевод строки.
    Чтобы перебрать теги внутри тега, найди этот тег в soup, а потом уже на теге вызови .find_all().
    Ответ написан
  • Правильное разбиение числа на группы, как реализовать?

    Vindicar
    @Vindicar
    RTFM!
    Делишь N на 40, округляешь вверх, получаешь число групп, на которые нужно разделить.
    Смотри math.ceil()
    Зная число групп, определить размер группы уже несложно.
    Ответ написан
    Комментировать
  • Как правильно получить Bot.fetch_user() в Disnake?

    Vindicar
    @Vindicar
    RTFM!
    Поясню ответ выше: ты вызываешь метод на классе Bot, а не на экземпляре этого класса в переменной bot. Будь внимательнее.
    Ответ написан
    Комментировать
  • При разбиении пути возникает ошибка. Как пофиксить?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию же.
    The return value is a tuple (type, encoding) where type is None if the type can’t be guessed (missing or unknown suffix) or a string of the form 'type/subtype', usable for a MIME content-type header.

    Т.е. для неизвестных типов у тебя в ftype попадёт None, а ты этого не проверяешь.

    EDIT: А вообще есть смысл делать guess_type()? Если у тебя тип файла известен заранее, то можно захардкодить и правильный mime-тип.
    Ответ написан
    Комментировать
  • Как изменить по имени сортировку списка?

    Vindicar
    @Vindicar
    RTFM!
    Потому что сортировка строк (например, имён файлов) - это лексикографическое сравнение. В этом сравнении "б" > "аааааааааа", просто потому что "б" > "а". Другое дело, что у человеков очень странные представления о порядке, и компьютеру трудно к ним адаптироваться.

    Если тебе нужен т.н. естественный порядок (natural sorting), тебе нужно как-то выцепить из имени тот кусок, по которому нужно делать сравнение. Например, так:
    import re
    PARTS = re.compile(r'^(.+?)(?:(\d+)\D+)?$')
    
    def natural_sort_key(fname: str):
        "Функция извлекает из имени файла описание, по которому его надо сортировать."
        prefix, index = PARTS.match(fname).groups()
        return (prefix, int(index) if index else 0)
    
    
    lst.sort(key=natural_sort_key)
    Ответ написан
  • Для чего нужен lock в python? Как работает данный пример кода?

    Vindicar
    @Vindicar
    RTFM!
    Это объясняется тем, что в базовом питоне потоки не вполне честные - они конкурируют за global interpreter lock, так что код выполняется всё равно поочерёдно. Так что многопоточность в питоне полезна с точки зрения распараллеливания, но не ускорения. ЕМНИП, есть реализации питона, в которых нет этой GIL problem.
    Но нужно иметь ввиду, что этот GIL блокирует только элементарные операции (как в твоём примере), тогда как явное использование lock может накрывать целые блоки кода, состоящие из нескольких операций с защищаемым ресурсом.

    Вот тебе пример:
    import threading
    import time
    
    class Data:
        def __init__(self):
            self.x: int = 0
            self.y: int = 0
    
    
    do_sleep = False
    run = True
    
    
    def reader(d: Data):
        while run:
            x, y = d.x, d.y
            # по идее это условие не должно выполниться никогда
            if (x != 0) != (y != 0):  
                print(f'Got x={x} and y={y}')
            else:
                print(f'OK {x}', end='\x08\x08\x08\x08')
    
    
    def writer(d: Data):
        while run:
            if d.x == 0:
                d.x = 1
                if do_sleep: pass
                d.y = 1
            else:
                d.x = 0
                if do_sleep: pass
                d.y = 0
    
    
    do_sleep = False
    instance = Data()
    reader_thread = threading.Thread(target=reader, args=(instance,), daemon=True)
    writer_thread = threading.Thread(target=writer, args=(instance,), daemon=True)
    reader_thread.start()
    writer_thread.start()
    try:
        input()
    finally:
        run = False
        reader_thread.join()
        writer_thread.join()


    На моей машине, если if do_sleep: pass закомментировать, то в консоли высвечивается только OK - иными словами, присваивание двух полей выполняется достаточно быстро, чтобы поток не успел переключиться в промежутке. Как следствие, reader() всегда видит либо x=0 y=0, либо x=1 y=1.
    Но если if do_sleep: pass оставить, то выполнение тела цикла замедляется достаточно, чтобы поток успел переключиться - и, как следствие, reader() начинает видеть структуру данных Data в неконсистентном состоянии, когда x=0 y=1 или когда x=1 y=0.
    И вот чтобы не гадать "успеет - не успеет", нужно в таких случаях защищать связные серии обращений к структуре с помощью мьютекса, ну или в питоновских терминах - Lock.
    Ответ написан
    Комментировать
  • Почеум при использывании функции 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!
    Плохо гуглил. Впрочем, если гуглил по запросу "вернуть значение из класса" (что есть бессмыслица) вместо хотя бы "строковое представление объекта", то неудивительно.
    Ответ написан
    Комментировать