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

    Vindicar
    @Vindicar
    RTFM!
    А) Запускай скрипт как суб-процесс через os.system() / subprocess / вариации на тему. Годится, если скрипт-сервис должен быть изолирован от основного скрипта.
    Б) импортируй модуль через importlib. Каждый модуль должен иметь точку входа, скажем, класс или функцию с заданным именем, которую основная программа активирует. Более тесное взаимодействие, со всеми плюсами и минусами.
    Ответ написан
    Комментировать
  • Как настроить универсальный хендлер в аиограм?

    Vindicar
    @Vindicar
    RTFM!
    Вместо text в callback_query_handler() укажи функцию, которая принимает CallbackQuery и возвращает True, если надо обработать данный запрос, и False, если нужно поискать другой обработчик. Для ускорения можешь все коды запросов в БД пометить отдельным префиксом (например, пусть они начинаются с "db_"), чтобы сразу отсечь посторонние коды.
    Просто погугли callback_query_handler, увидишь что-то типа lambda callback_query: True - это означает "принимать любые коды запроса". Но ведь можно True возвращать не всегда.
    Ответ написан
    Комментировать
  • Хочу прописать арифметические действия телеграм боту. Как это сделать?

    Vindicar
    @Vindicar
    RTFM!
    Читай на тему finite state machine. Не знаю конкретно насчёт telebot, а другие библиотеки содержат эту фичу.
    Но в целом идея несложная - ты должен для каждого пользователя помнить, на каком шаге он находится (ожидание первого числа, ожидание оператора, ожидание второго числа) и что он вводил раньше. Получив сообщение, смотришь по ID пользователя его шаг, и обрабатываешь текст сообщения соответственно. Можно это и вручную реализовать.

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

    Vindicar
    @Vindicar
    RTFM!
    Ну немногие фреймворки такое позволяют. Можно подёргать WinAPI, например, SetWindowRgn() (позволяет задать видимую и "осязаемую" область окна). Тогда можно сделать окно на твоём предпочитаемом фреймворке, узнать дескриптор окна, и вызвать эту функцию через ctypes для задания непрозрачных областей.

    Насчёт Qt не скажу, может, оно и умеет такое "из коробки".
    Ответ написан
    Комментировать
  • Как можно изменить код, чтобы он работал быстрее?

    Vindicar
    @Vindicar
    RTFM!
    result = numpy.zeros(mask.shape + (3,), dtype=numpy.uint8)
    result[mask > 0] = (255, 255, 255)

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

    Vindicar
    @Vindicar
    RTFM!
    1. Научиться отправлять сообщение в чат с заранее известным ID вместо использования message.answer().
    2. Хранить ID (или список ID), которым надо разослать сообщение.
    3. Научиться пользоваться пакетом aioschedule. В частности, как планировать вызов корутины и что нужно сделать для обеспечения работы пакета.
    4. Понять, как пользоваться asyncio.create_task(), чтобы запускать рабочий цикл aioschedule параллельно с работой бота. В частности, как выполнить код непосредственно при старте бота, а не как реакцию на сообщение.
    5. Свести эти знания вместе.

    При старте бота запускаем рабочий цикл aioschedule и планируем выполнение корутины опроса. Корутина опроса проходит по списку ID и каждому отправляет сообщение, одновременно задавая нужное состояние на машине состояний FSM. Дальше работа идёт как обычно - приняли сообщение пользователя, обработали состоянием, перешли к следующему состоянию.
    Ответ написан
    Комментировать
  • В чем разница между параметрами и атрибутами классов?

    Vindicar
    @Vindicar
    RTFM!
    Параметры метода относятся только к самому методу. Остальной класс про них знает, но только в плане "что нужно передать этому методу при вызове". Как метод использует тот или иной параметр - это его дело.

    Атрибуты класса привязаны к экземпляру класса. По сути, у большинства объектов есть скрытый словарь __dict__, который хранит атрибуты этого объекта. Создание атрибута означает внесение записи в __dict__.

    Как атрибуты создаются - определяется в первую очередь конструктором класса, т.е. методом __init__(), хотя и не только им. Обычно можно создать атрибут в любой момент времени, хотя это не рекомендуется делать, так как это запутывает программу.

    При этом у __init__() есть полная свобода действий в плане того, откуда брать значения для атрибутов класса и какие атрибуты создавать. Пример:
    class Point:
        def __init__(self):
            self.x = 0
            self.y = 0
    
    point = Point()
    # у point есть два собственных атрибута, x и y
    print(point.__dict__)  # {'x': 0, 'y': 0}

    Здесь конструктор не принимает параметров, так как он использует константы для создания атрибутов.
    Он также мог бы брать значения атрибутов из собственных параметров, мог бы иметь параметры, которые не относятся к атрибутам, или всё сразу в любой комбинации.

    Пример параметров, не относящихся к атрибутам:
    class Point:
        def __init__(self, is_3d):
            self.x = 0
            self.y = 0
            if is_3d:  # этот параметр не используется как значение атрибута
                self.z = 0  # а этот атрибут может присутствовать или отсутствовать
    
    point_2d = Point(False)
    print(point_2d.__dict__)  # {'x': 0, 'y': 0}
    point_3d = Point(True)
    print(point_3d.__dict__)  # {'x': 0, 'y': 0, 'z': 0}

    Пример создания атрибута "на ходу":
    class Point:
        def __init__(self):
            self.x = 0
            self.y = 0
    
    point = Point()
    print(point.__dict__)  # {'x': 0, 'y': 0}
    point.name = 'Start'  #  создаём атрибут "на ходу"
    print(point.__dict__)  # {'x': 0, 'y': 0, 'name': 'Start'}


    Опять же, это не самая хорошая практика - куда лучше, когда набор атрибутов у объекта всегда один и тот же, и не меняется во время выполнения программы. Так меньше путаницы.
    Но это пример того, что атрибуты - это, по сути, ключи в связанном с объектом словаре, а потому могут создаваться и изменяться, если это нам требуется.
    Ответ написан
    2 комментария
  • Почему я получаю данную ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Да, таблицу и столбцы нельзя делать через подстановку. В чем именно ошибка непонятна?
    Ответ написан
    Комментировать
  • Как убрать ограничения чтения названия столбца в PostgreSQL?

    Vindicar
    @Vindicar
    RTFM!
    https://www.postgresql.org/docs/7.0/syntax525.htm
    The system uses no more than NAMEDATALEN-1 characters of a name; longer names can be written in queries, but they will be truncated. By default, NAMEDATALEN is 32 so the maximum name length is 31 (but at the time the system is built, NAMEDATALEN can be changed in src/include/postgres_ext.h).


    Только компилять свою версию постгре с увеличенной константой NAMEDATALEN.
    Ну или исправить кхм, странную архитектуру твоей программы, которой нужны длинные рускоязычные имена столбцов.
    Ответ написан
    6 комментариев
  • Как исправить эту ошибку ValueError: invalid literal for int() with base 10: "b'8"?

    Vindicar
    @Vindicar
    RTFM!
    data=str(ArduinoSerial.readline())
    Включи голову. Так ты данные из строки байт (тип bytes) в строку символов (тип str) не преобразуешь.
    Нужно использовать ту или иную кодировку.
    Если у тебя нет кириллицы и т.п. символов (например, латиница и/или цифры), можно использовать
    data = ArduinoSerial.readline().decode('ascii')
    Ну и обработку исключений добавь, а то мало ли что тебе придёт с последовательного порта.
    Ответ написан
  • Насколько критично использование pydantic в асинхронных приложениях?

    Vindicar
    @Vindicar
    RTFM!
    Не стоит спользовать длительные синхронные вызовы в асинхронном коде.
    Во-первых, валидация - это CPU-bound задача, а не IO-bound. Её можно вынести в поток, но и только. Просто асинхронно её не выполнишь.
    Во-вторых, если у тебя не ChatGPT данные валидирует, скорее всего время выполнения валидации будет пренебрежимо малым.
    Ответ написан
    Комментировать
  • Как обработать команду в телеграмм боте при работающем расписании на aioschedule?

    Vindicar
    @Vindicar
    RTFM!
    await asyncio.create_task(scheduler())
    Ты ждешь, пока scheduler() не закончит работу. Зачем? Вызов create_task() сам по себе планирует выполнение переданной корутины, её не имеет смысла awaitить - разве что только в плане "дождаться конца задачи".
    Оставь просто вызов create_task(), без await, ну или сохрани возвращаемое create_task() значение в переменную (если нужно будет потом прервать выполнение scheduler()).
    Ответ написан
    1 комментарий
  • Как найти наибольшее по сумме чисел?

    Vindicar
    @Vindicar
    RTFM!
    number //= 1
    Может, всё-таки 10?

    Ну и почему ты делаешь проверку на максимум после каждой цифры (т.е. внутри while),а не после того как ты посчитал сумму всех цифр числа?
    Ответ написан
    1 комментарий
  • Вопрос по реализации скачивания нескольких изображений. Как выполнить?

    Vindicar
    @Vindicar
    RTFM!
    Добавлял уникальный ID к имени товара, к имени фото

    Ну так добавляй ID к имени фото, но не к имени товара, делов-то.
    Ответ написан
    2 комментария
  • Как открыть базу данных и записать туда айди пользователя в VkBottle?

    Vindicar
    @Vindicar
    RTFM!
    В гугле забанили?
    Всегда читай документацию, там обычно есть примеры.
    Вот релевантный.
    from peewee import *
    
    db = SqliteDatabase('people.db')
    
    class Person(Model):
        name = CharField()
        birthday = DateField()
    
        class Meta:
            database = db # This model uses the "people.db" database.
    
    db.connect()
    db.create_tables([Person])
    from datetime import date
    uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15))
    uncle_bob.save() # bob is now stored in the database
    Ответ написан
    3 комментария
  • Как подсвечивать разными цветами текст в виджете text tkinter?

    Vindicar
    @Vindicar
    RTFM!
    1. Почитать документацию о том как работают теги. В частности, методы tag_add(), tag_remove() и tag_config().
    2. Сделать простой пример, чтобы убедиться, что ты понял, как оно работает.
    3. Применить в своём проекте.
    Ответ написан
  • Как зациклить код в Python?

    Vindicar
    @Vindicar
    RTFM!
    Почитай про цикл while.
    Ответ написан
    Комментировать
  • Как изменить формат logger.info(...) в str или передать в переменную(python)?

    Vindicar
    @Vindicar
    RTFM!
    Никак, логгеры не возвращают сообщения об ошибках.
    Пиши класс-потомок logger.Handler который будет сохранять сообщения в БД, и назначай экземпляр этого хандлера нужным логам.
    Подробности в доках на модуль logging, но если кратко - там разделение обязанностей. Есть Formatter, который занимается превращением записи в строку, есть Handler, который пихает полученную строку в файл или ещё куда, есть Filter, который реализует умную фильтрацию записей, ну и т.д.
    Ответ написан
    1 комментарий
  • Что выполняет эта функция?

    Vindicar
    @Vindicar
    RTFM!
    Ничего она не делает. Тело функции - это
    # тело
        length = len(array)
        group_len = int(group_len)
        space = int(space)
        if limit is None:
            limit = length

    Ни одна из этих операций не меняет ничего вне функции.
    Всё что выше - список параметров с указанием типа (type hint) и значений по умолчанию.
    Ответ написан
    Комментировать
  • Сравнить два целых числа поразрядно?

    Vindicar
    @Vindicar
    RTFM!
    Преобразовать в строку и сравнить строки.
    Если нужно узнать количество совпадающих старших разрядов - последовательно сравнивать подстроки длины N, начиная с позиции 0.
    Ответ написан
    Комментировать