Ответы пользователя по тегу Python
  • Можно ли запретить вызов init при создании ссылки на экземпляр класса?

    Vindicar
    @Vindicar
    RTFM!
    Можно не создавать __init__(), а его логику поместить в __new__(), ну или вынести в отдельный приватный метод, который вызывать из __new__().
    Ответ написан
  • Почему python не видит объявленную переменную?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри внимательно, у тебя опечатка.
    undetected_chromedrive - куда последняя r пропала?

    Далее, у тебя кривая логика обработки ошибок. Блок finally подразумевает, что driver был успешно сконструирован - а это не факт. Тебе нужно два блока - один try-except для обработки ошибок программы, и вложенный try-finally - для работы с успешно сконструированным driver.

    Далее, что за time(25)? Это бессмыслица, так как time - это модуль.

    И вообще, судя по тексту ошибки, такое чувство, что ты пытаешься сразу собрать скрипт в EXE-файл. Отладь сначала скрипт как есть.
    Ответ написан
    Комментировать
  • Tortoise orm создается объект в бд, из-за не правильного foreign key, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ну вообще-то тебе прямо говорят про default_connection.
    Ты await Tortoise.init() делал?
    Ответ написан
  • При создании второго хэндлера CallbackQuery, все остальные перестают работать, как сделать что бы срабатывали оба?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты в обоих случаях прописываешь callback handler, обрабатывающий ВСЕ кнопки (так как в качестве func ты передаёшь предикат, всегда возвращающий истину, т.е. "я готов это обработать").
    Далее, что значит "не помогло"?
    @bot.callback_query_handler(func=lambda call: call.data.startswith('text'))

    Вот прямо так и писал? или всё-таки заменял 'text' на что-то своё?
    Потому что если так и писал, то ты тем самым сказал "вызывай этот обработчик для тех случаев, когда call.data начинается со слова text". У тебя ни в одном случае call.data не начинается с text.

    Тут идея проста как два пальца: сделай иерархию в тексте call.data.
    Например, в первом случае
    item_yes = types.InlineKeyboardButton(text='Принять', callback_data='order_approve.yes')
    item_no = types.InlineKeyboardButton(text='Отказаться', callback_data='order_approve.no')

    Тут order_approve - что-то типа пространства имён, чтобы можно было отличать значения, приходящие по разным поводам (т.е. кнопки, обрабатываемые в рамках разных диалогов).
    И тогда прописать обработчик можно будет так
    @bot.callback_query_handler(func=lambda call: call.data.startswith('order_approve.'))


    Во втором случае сделай по аналогии.
    Ответ написан
    Комментировать
  • Эхо-бот никак не реагирует, что я упустил?

    Vindicar
    @Vindicar
    RTFM!
    bot.mesaage_handler

    В консоль смотрел? Там должна быть ошибка на тему "Attribute 'mesaage_handler' not found."
    Ответ написан
    Комментировать
  • Как наложить одно изображение на другое без размытия, смешивания и прозрачности?

    Vindicar
    @Vindicar
    RTFM!
    Если нужно заменить прямоугольник пикселей, то это делается тривиально:
    img1[top1:bottom1, left1:right1] = img2[top2:bottom2, left2:right2]

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

    Если же нужно работать с альфа-каналом, то для начала его неплохо бы прочитать.
    image = cv2.imread('image.png', cv2.IMREAD_UNCHANGED)

    UNCHANGED не преобразует в BGR, а грузит как есть, в том числе альфа канал.
    И тогда нужно будет сделать что-то типа
    mask = image[..., 3] > 0  # если считаем, что чем меньше - тем прозрачнее
    background[top:bottom, left:right][mask] = image[mask]  # не забываем про равенство размера!
    Ответ написан
  • Почему при вводе числа всегда будет выводиться (доброй ночи)? Как исправить ошибку?

    Vindicar
    @Vindicar
    RTFM!
    1. Сначала проверяй более узкий диапазон (например, 22 часов - 5 часов), потом уже более широкий.
    2. Ты вообще понимаешь, что ты сравниваешь строки, а не целые числа? Строки сравниваются в лексикографическом порядке, т.е. символы берутся слева направо и сравниваются по позиции в алфавите до первого неодинакового символа. Т.е. "5" будет больше "12".
    Ответ написан
    Комментировать
  • Как управлять приложением windows средствами python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Сможете проверить правильность решения моего задания?

    Vindicar
    @Vindicar
    RTFM!
    1. Я подозреваю, что "вывести на экран" относится ко всем трём пунткам.
    2. Числовое значение != целочисленное значение
    Ответ написан
    4 комментария
  • Как реализовать цикл в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Это называется машина состояний.

    Если делать самому, то для каждого пользователя надо хранить сведения о текущем шаге. Например: "вводит значения, введены значения А, Б, В".
    Желательно хранить в перманентном хранилище типа БД, чтобы если что, пользователь не терял введённые сведения.
    При получении сообщения смотреть, на каком шаге находится пользователь, и обрабатывать сообщение в зависимости от этого.

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

    Vindicar
    @Vindicar
    RTFM!
    Вместо обращений по относительным путям, строй обращения относительно корня скрипта. pathlib в помощь.
    import sys
    import pathlib
    
    SCRIPT_DIR = pathlib.Path(sys.argv[0]).parent
    CONFIG = SCRIPT_DIR / 'config.ini'
    
    with open(CONFIG, 'rt') as cfg:
        ...
    Ответ написан
    1 комментарий
  • Как вывести баланс в телеграм боте?

    Vindicar
    @Vindicar
    RTFM!
    Значит у тебя нет записи в БД для этого юзера. Ты add_user() точно выполнял для него?
    Ответ написан
  • Можете объяснить код простой программы из ответа по ОГЭ?

    Vindicar
    @Vindicar
    RTFM!
    Потому что нигде не сказано, что последовательность идёт строго по возрастанию.
    Пример: 7 3 500 6 9 5 8
    Без второго условия программа увидит число 5 и перезапишет result = 5, хотя оно меньше чем более раннее 500.
    Ответ написан
    1 комментарий
  • Как не допустить такую ошибку?

    Vindicar
    @Vindicar
    RTFM!
    1. global price2
    Глобальные переменные - хороший способ огрести проблем при одновременном доступе нескольких пользователей. Они работают только если обращается один пользователь за раз.
    2. cur.execute(f"UPDATE
    Никогда не создавай SQL запросы через f-строки, используй подстановку параметров.
    Ответ написан
    Комментировать
  • Ошибка списка: SyntaxError: invalid syntax. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    1.
    interval = list(data('interval') # преобразуйте столбец interval в список

    Не закрыта круглая скобка для list(
    2. for index in data:
    Что за дикий отступ? В питоне отступы значимы, к ним надо относиться очень внимательно.
    Ответ написан
    Комментировать
  • Можно ли импортировать что-то из разных... серверов?

    Vindicar
    @Vindicar
    RTFM!
    И как это сделать?

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

    Что за игра, что за сервер? Может, у него уже есть какое-то API, по которому можно вытащить интересующие данные?

    Собственно, что это за данные? Каков их объём? Именно данные, или нужно оповещение о событиях в игре? Разница очень большая, так как будет определять, кто будет проявлять инициативу при отправке данных - сервер или бот.

    Если API нет, есть ли доступ к исходникам сервера? Как организован рабочий цикл сервера? Потребуется ли нам запускать отдельный поток - а значит, синхронизировать доступ к искомым данным? Или же там что-то на базе asyncio, и мы можем просто добавить асинхронную задачу?

    Нужно определиться с форматом отдачи данных - тут лучше не изобретать велосипед, а использовать JSON, если данных не очень много.

    Можно подумать о том, чтобы добавить в серверный скрипт небольшой сервер на Flask, или на базе asyncio streams, или на голых сокетах. Конкретная реализация зависит в том числе от того, кто проявляет инициативу: если бот запрашивает, а сервер отвечает, то Flask позволит обращаться к серверу по HTTP, а не громоздить велосипед на сокетах. Если же сервер может что-то слать по своей инициативе, то тут уже HTTP подойдёт так себе.

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

    Vindicar
    @Vindicar
    RTFM!
    Подход, предложенный @Ипатьев, в принципе неплох.
    Но я считаю, стоит помнить, что питон - язык с динамической типизацией. Если какой-то тип умеет выполнять требуемые от него операции, стоит этот тип принимать. Иными словами, тебе необязательно принимать именно список или кортеж - тебе подойдёт любая коллекция, которую можно перечислить, и у которой есть длина.
    Так что я бы посоветовал сделать иначе:
    import collections.abc as abc
    # Collection требует поддержки итерации, проверки вхождения и длины.
    def avg(data_set: abc.Collection[int]) -> float:  # type hint для разработчика и IDE
        # если получим что-то не то, будет выкинуто TypeError - а нам это и надо.
        avg = sum(data_set) / len(data_set)  # такое деление вернёт float
        return avg


    Либо, если тебе хочется своей обработки ошибки:
    import collections.abc as abc
    
    def avg(data_set: abc.Collection[int]) -> float:  # type hint для разработчика и IDE
        # протокол abc.Collection можно проверять через isinstance()
        if not isinstance(data_set, abc.Collection):  
            raise TypeError(f'data_set must be a collection of ints, got {type(data_set)}')
        avg = sum(data_set) / len(data_set)  # такое деление вернёт float
        return avg

    Иными словами, может иметь смысл определить минимально необходимый тебе набор операций, и описывать как входной тип именно его. Хотя зачастую можно и не заморачиваться. Если ты значешь, что будешь передавать в функцию только список - можешь прописывать только список.

    И это будет работать:
    >>> avg([1,2,3])  # список
    2.0  # работает
    >>> avg({1,2,3})  # множество
    2.0  # работает
    >>> avg(x for x in range(3))  # выражение-генератор
    Traceback (most recent call last):  # отказ, у генераторов нет заранее известной длины
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in avg
    TypeError: data_set must be a collection of ints, got <class 'generator'>
    Ответ написан
    Комментировать
  • Как сделать активным свой выбор в меню?

    Vindicar
    @Vindicar
    RTFM!
    Ну гугл по "pygame menu" выводит на одноименный пакет pygame-menu. Посмотри примеры кода, если понравится - установи и пользуйся.
    Ответ написан
  • Как спарсить данные с сайта?

    Vindicar
    @Vindicar
    RTFM!
    Этот формат называется JSON. В стандартной библиотеке Питона есть одноименный модуль для работы с ним.
    Он позволит превратить строку в обычный питоновский словарь. Как со словарём работать, надеюсь, знаешь.
    Вытащишь из словаря нужные данные, и с ними уже делай что надо. Хоть выводи на экран, хоть закинь в другой пустой словарь (чтобы лишнего ничего не было) и запакуй обратно в JSON.
    Ответ написан
    1 комментарий
  • Различия работы requests в Windows и Linux?

    Vindicar
    @Vindicar
    RTFM!
    Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:103.0)

    Попробуй на винде воткнуть User-Agent от виндовой версии мозиллы.
    Ответ написан