Задать вопрос
Ответы пользователя по тегу Python
  • Классы. Принцип работы __add__ с __radd__?

    Vindicar
    @Vindicar
    RTFM!
    1. Пытается отработать x + y. Вызывается x.__add__(y) (или, что то же самое, Commuter5.__add__(x, y)).
    2. Внутри кода __add__() вычисляется выражение self.value + other. Вызывается self.value.__add__(other)(int.__add__(self.value, other), так как self.value содержит целое число).
    3. int понятия не имеет, что такое Commuter5 и как с ним складываться. Его __add__() возвращает NotImplemented. Питон понимает, что от int помощи не дождёшься.
    4. Поэтому вызывается other.__radd__(self.value).
    5. Внутри этого метода вычисляется выражение self.value + x. В данном случае x - это self.value для первого операнда, т.е. число. self.value - тоже число. int знает, как складываться с другим int, и выражение даёт int.
    6. Отрабатывает конструктор Commuter5() внутри __radd__(). Создаётся новый экземпляр класса, и возвращается как результат вызова __radd__().
    7. Отрабатывает конструктор Commuter5() внутри __add__(). Результат (ещё один экземпляр Commuter5) возвращается наружу.
    8. z присваивается результат, возвращённый вызовом __add__().

    По-моему, в коде ошибка, так как в результате у нас окажется, что внутри Commuter5() будет ещё один объект Commuter5(), внутри которого уже будет сумма. Ты можешь проверить это достаточно просто:
    print(type(z.value))
    Если выведет <class Commuter5 ...> - значит, я прав.
    Чтобы это исправить, операторы __add__() и __radd__() должны проверять, что получилось в результате суммирования, и не заворачивать результат в Commuter5() еще раз.
    Ответ написан
    2 комментария
  • Python pyautogui есть ли решение задачи?

    Vindicar
    @Vindicar
    RTFM!
    Нужно отложить скрипт, взять учебник по Питону, и почитать, что такое исключения и как с ними работать (оператор try-except).
    Тогда станет понятно, почему твой код не работает, и как его поправить.
    Ответ написан
    Комментировать
  • Как можно оптимизировать этот код?

    Vindicar
    @Vindicar
    RTFM!
    Для начала определи, что у тебя занимает время - скачивание, или парсинг. Подходы будут разные.
    Если хочется в лоб решать задачу - то multiprocessing в руки, даёшь дочернему процессу URL, он тебе возвращает структуру данных. Главный процесс раздаёт URLы и собирает ответы в какое-то итоговое хранилище.
    Пример работы с пулом процессов.
    Ответ написан
    Комментировать
  • Для чего нужны метаклассы в Python?

    Vindicar
    @Vindicar
    RTFM!
    Это механизм, позволяющий изменить процесс создания класса.
    Например, превратить аннотации типов в классе в поля/свойства экземпляра и автоматически создать их в конструкторе, или зарегистрировать созданный класс в некотором реестре, или ещё что-то. Да, всё это можно сделать и с помощью декораторов или иных инструментов - но метаклассы позволяют это сделать вообще без дополнительных телодвижений со стороны пользовательского кода.
    Как, по твоему, тот же pydantic превращает описание класса-модели, состоящее из одних аннотаций, в класс с геттегами/сеттерами, валидацией и ещё чёрт знает чем?
    Ответ написан
    Комментировать
  • Как правильно аннотировать словарь Python?

    Vindicar
    @Vindicar
    RTFM!
    Варианты 1 и 2 ссылаются на вполне конкретный класс dict. Когда typing только ввели, стандартынй dict не поддерживал такую запись, поэтому создали псевдоним typing.Dict. Потом к этому типу (а также к tuple и list) прикрутили возможность вести себя как генерик. Сейчас Dict, List и Tuple потихоньку планируют выводить из употребления. Они deprecated начиная с питона 3.9.
    Вариант 3 - это любой объект, который ведёт себя как словарь, не обязательно именно dict. Но с 3.9 это алиас для collections.abc.Mapping, по той же самой причине.

    Так что вариант 2 и 3 имеет смысл, только если тебе нужно поддерживать питон 3.8 и младше.
    Выбор между вариантом dict и collections.abc.Mapping зависит от того, что именно тебе нужно - вот прямо dict, или просто что-то словареподобное. См. список методов Mapping тут.
    Ответ написан
    1 комментарий
  • Почему не получается спарсить названия учебных заведений?

    Vindicar
    @Vindicar
    RTFM!
    Ты хотя бы в браузере пробовал открыть исходный код страницы (обычно Ctrl-U)?
    Это динамический сайт, там по умолчанию в body два с половиной скрипта, которые уже подтягивают остальной контент. Конечно, ты его не получишь одним запросом.
    Выясняй, какой запрос скрипты делают для получения контента, и имитируй уже его. Консоль разработчика в помощь.
    Ответ написан
    Комментировать
  • Как сделать так чтобы объединённые ячейки тоже показывались в print?

    Vindicar
    @Vindicar
    RTFM!
    Значение объединённой ячейки находится в левой/верхней "оригинальной" ячейке из состава объединённой.
    Так что если у тебя есть столбец с объединённой ячейкой, делай там простую логику типа такой:
    last_results_publication_value = ''  # тут храним последнее увиденное значение столбца
    for row in schedule_table.find_all('tr')[1:]:  # перебираем строки
        cells = row.find_all('td')
        subject = cells[0].get_text(strip=True)
        grades = cells[1].get_text(strip=True)
        dates = cells[2].get_text(strip=True)
        results_publication = cells[3].get_text(strip=True)
        if results_publication:  # если в столбце есть значение
            last_results_publication_value = results_publication  # запоминаем его как последнее виденное
        else:  # а если нет
            results_publication = last_results_publication_value  # используем вместо него последнее виденное
        ...  # дальше используем значения
    Ответ написан
  • Как считать файл и разбить текст на списки строк?

    Vindicar
    @Vindicar
    RTFM!
    Так файл самостоятельно надо сформировать, или он уже сформирован?
    И что считается строкой? Одно предложение? Или как в конце вопроса?
    Самый простой вариант - вставь в записываемую строку символ перевода строки (\n) в нужных местах.
    Например, f.write('foo\nbar\nbaz) даст
    foo
    bar
    baz
    Ответ написан
    Комментировать
  • Как сделать так, чтобы модель работала для любых входов/выходов?

    Vindicar
    @Vindicar
    RTFM!
    Делаешь простой цикл for i in range(inp, out, -1):, в теле цикла добавляешь в список слоёв ещё один слой c размером входа i и размером выхода i-1.
    Ответ написан
    Комментировать
  • Почему VS Code не распознает, что функция вернет tuple?

    Vindicar
    @Vindicar
    RTFM!
    Потому что оба оверлоада неразличимы - они ОБА показывают один аргумент типа bool.
    И да, а если аргумент не указан, что вернёт функция? Из твоего кода это неясно вообще, так как у тебя два противоречащих варианта.
    Тебе надо что-то типа...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[False] = False) -> str:
        ...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[True]) -> tuple[str, str]:
        ...
    @classmethod
    def get_mac_address(cls, with_gateway: bool = False) -> typing.Union[str, tuple[str, str]]:
        ...
    Ответ написан
    3 комментария
  • Ошибка PyInstaller решение?

    Vindicar
    @Vindicar
    RTFM!
    Судя по traceback, косяк в твоём модуле bottle.py. Там происходит вывод в консоль, через print(), через модуль logging, или вообще через sys.stdout.write()/sys.stderr.write().
    Ответ написан
    3 комментария
  • Почему не работает telegram бот?

    Vindicar
    @Vindicar
    RTFM!
    @dp.message_handler()
    async def bot_message(message: types.Message):
        ...
    
    # Список для хранения значений
    values = []
    
    @dp.message_handler(lambda message: len(values) < 5)
    async def process_input(message: types.Message):
        ...


    У тебя первый же обработчик заявляет, что готов обрабатывать ВСЕ входящие сообщения. Соответственно, бот дальше и не ищет ничего. Зачем, если первый же обработчик на всё согласен?
    Освой нормальный конечный автомат (finite state machine, FSM), что ли? Есть же официальная документация, официальные примеры, только найди и прочитай...
    Ответ написан
    Комментировать
  • Как ввести несколько строк в стандартный ввод python?

    Vindicar
    @Vindicar
    RTFM!
    Стандартный ввод - это файл, и его технически можно "прочитать до конца". Пример:
    import sys
    for line in sys.stdin:
        print('Got', repr(line))
    print('Done')

    Запусти как обычно, введи несколько строк, а потом в терминале (если под виндой) нажми Ctrl-Z, затем Enter.
    Это пошлёт сигнал "конец файла", и дальнейшие попытки ввода через input() будут не успешными.

    Также можешь записать строки в текстовик, и запустить файл с перенаправлением ввода:
    python3 main.py < data.txt
    Тогда скрипт тоже получит сигнал о конце ввода, когда файл закончится.
    Ответ написан
    1 комментарий
  • Как интерпретировать данные в читабельный вид?

    Vindicar
    @Vindicar
    RTFM!
    У тебя request.get_json() возвращает структуру данных - просто вынимай из неё нужные поля.
    Всего-то нужно чуть-чуть почитать, как работать со словарями и списками в питоне.
    Например, data['notification_name'] вернёт название события.

    Это не единственная проблема в коде, конечно. Вот почему нельзя использовать chatgpt для написания кода, у него большие проблемы с пониманием общей структуры программы.
    Ответ написан
    3 комментария
  • При запуске бота выходит ошибка, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Если ты пытаешься парсить https://habr.com/ru/news/, то у меня плохие новости - там контент подгружается динамически, с помощью JS. Эта тема тут уже не раз обсуждалась, ищи "как парсить динамический сайт".
    Ответ написан
  • Как отправить двумерный список через aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Изучай метод str.join(), его вполне достаточно.
    Ответ написан
    Комментировать
  • Прирост в производительности после переноса алгоритма с Python на C++/C?

    Vindicar
    @Vindicar
    RTFM!
    У тебя вычисление повторяется для каждой строки? Посмотри, можно ли распараллелить код на несколько процессов (именно процессов, не потоков).
    Также посмотри насчёт использования numpy/scipy и их численных солверов для систем уравнений вместо sympy. Может, используя sympy, получится сформулировать алгоритм расчёта, а уже его портировать на numpy?

    Если надумаешь использовать numpy, держи в уме вот что: по возможности выполняй операции сразу над массивами значений. Упрощённо, вот это
    a = numpy.array([3] * 1000000, dtype=numpy.float32)
    b = 2 * a + 3

    будет намного быстрее, чем это:
    a = numpy.array([3] * 1000000, dtype=numpy.float32)
    b = numpy.zeros_like(a)
    for i in range(a.shape[0]):
        b[i] = 2 * a[i] + 3

    Причина простая - операции над массивами реализуют перебор элементов массива нативно, т.е. с той же проивзодительностью, что и C/C++/Fortran. А вот сугубо питоньи циклы - штука медленная.
    Ответ написан
  • Как добавить в базу данных два сообщения в телеграмм боте?

    Vindicar
    @Vindicar
    RTFM!
    bot.register_next_step_handler(message, impact_KEYBORD_bot)
    bot.register_next_step_handler(message, donat_user_bot)
    bot.register_next_step_handler(message, translate_message)
    bot.register_next_step_handler(message, dictionary_message)

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

    Vindicar
    @Vindicar
    RTFM!
    Нет. Только считать последние успешно/неуспешно отправленные сообщения.
    Ответ написан
    Комментировать
  • Как написать тг бот-секундомер на питоне?

    Vindicar
    @Vindicar
    RTFM!
    В коде дикая каша - или у тебя отступы уехали чёрт знает куда. Такое не заработает.
    Начни с официальных примеров, найди среди них наиболее похожий - скажем, вот этот таймер. Разберись, как он устроен, и потихоньку модифицируй.
    Разумеется, предполагается, что ты хотя бы насколько-то знаешь питон. Если это не так - откладываешь бота и учишь язык.
    Ответ написан
    Комментировать