Задать вопрос
  • Почему 2-handler не запускается?

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler() означает, что следующая функция будет обслуживать ВСЕ входящие сообщения, независимо от их содержимого. Соответственно, будет вызываться она, а последующие обработчики сообщений - нет.
    Либо используй параметры message_handler(), чтобы сузить круг обрабатываемых этой функцией сообщений.
    Либо помещай всю логику обработки сообщений в эту функцию, т.е. соедини оба обработчика в один.
    Ответ написан
    Комментировать
  • В чем преимущество статического массива перед динамическим?

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

    Динамический массив:
    + Размер может определяться во время выполнения.
    - Нужно не забыть освободить память массива самостоятельно.

    А вообще, если нет причин делать иначе, используй std::vector. Если тебе понадобится именно массив в стиле C, вектор позволяет его легко получить методом .data().
    + Размер не просто динамический, вектор может переаллоцировать свою память по мере надобности. Так что для ситуаций, когда размер заведомо неизвестен, вектор весьма удобен.
    + Вектор сам управляет своей памятью. Убил вектор - убил управляемый им массив.
    Ответ написан
    1 комментарий
  • Из за чего появляется ошибка в строке client.run(config.TOKEN)import discord?

    Vindicar
    @Vindicar
    RTFM!
    В чём моя проблема ?

    1. В том, что ты не знаешь питон, а рвёшься писать ботов. Иначе знал бы, что client.run(config.TOKEN)import discord - это и впрямь неверный синтаксис.
    2. В том, что ты не осилил редактор текста на этом сайте, и не озаботился отформатировать код.
    3. Ну и в том, что ты, походу, вставил код бота в файл дважды.
    Ответ написан
    Комментировать
  • Как ипортировать функции из файлов?

    Vindicar
    @Vindicar
    RTFM!
    Ещё один товарищ не учил Питон, но рвётся написать божественного бота...

    Когда ты импортируешь файл (модуль), этот модуль выполняется - практически так же, как если бы ты его запустил непосредственно. Различие есть, но небольшое. Теперь посмотрим на твои файлы.
    В первом файле ты объявляешь переменную bot. Она существует в пространстве имён первого файла (модуля).
    Если ты в нём делаешь import second_file, в нём тоже присутствует создание переменной bot - в локальном пространстве имён этого модуля. Это две разные переменные, и два разных экземпляра класса Telebot.
    Поэтому когда ты выполняешь в одном файле bot.run() (ну или как там бот запускается), ты запускаешь только один экземпляр. Второй остаётся неактивированным, и всё, что к нему привязано, не работает.

    Тебе надо как-то передать переменную bot во-второй файл, не нарвавшись при этом на циклический импорт (чтобы не было "первый импортирует второй, а второй - первый").
    Тут поможет ещё один простой факт: в питоне всё - операторы. Т.е. объявление функции - это оператор. Его можно помещать куда угодно, внутрь любого блока программы: внутрь if, внутрь цикла, внутрь другой функции. Он выполнится при выполнении соответствующего блока.
    Так что ты можешь завернуть свои обработчики из второго файла в функцию, принимающую ссылку на bot. А потом импортировать эту внешнюю функцию в первый файл и там её вызвать.
    #второй файл, second_file.py
    import telebot
    from telebot import types
    # эта функция создаст все обработчики и зарегистрирует их в предоставленном боте
    # вызывай её строго один раз за скрипт
    def register_handlers(bot):
        # а тут уже пошли обработчики
        @bot.message_handler(commands=['start'])
        def start(message):
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            btn0 = types.KeyboardButton(' Каталог фильмов')
            btn1 = types.KeyboardButton(" Каталог фильмов")
            btn2 = types.KeyboardButton(' Случайный фильм')
            btn3 = types.KeyboardButton(' Предложить фильм')
            markup.add(btn0, btn1, btn2, btn3)
            bot.send_message(message.from_user.id, ' Привет, {0.first_name}. Я Kinomorph - бот, с которым ты можешь найти интересный фильм для просмотра вечером\n \n Если у тебя есть номер или название фильма, ввести его можно прямо сейчас'.format(message.from_user), reply_markup=markup)
    
    # любой код, который не должен исполняться при импорте, оформляй так:
    if __name__ == '__main__':   # переменная __name__ содержит имя, под которым импортируется модуль
        print('Этот код выполнится ТОЛЬКО если файл запущен напрямую.')
        print('Он не выполнится при импорте файла.')


    # первый файл, main.py
    import telebot
    import config
    import second_file  # модуль импортируется - в нём __name__ будет равно "second_file", а не "__main__"
    
    # инициализация
    bot = telebot.TeleBot(config.Token)
    second_file.register_handlers(bot)  # тут вызывается импортированная функция
    Ответ написан
    Комментировать
  • Почему не работает bot_func.stop(Client, module Pyrogram)?

    Vindicar
    @Vindicar
    RTFM!
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    Зачем?!
    Если у тебя бот асинхронный, просто сделай саму функцию GetUserByUsername() async.
    Ответ написан
  • Как получить списки в переменные?

    Vindicar
    @Vindicar
    RTFM!
    list_of_lists = [spisok[i:i + n] for i in range(0, len(spisok), n)]
    Ответ написан
    Комментировать
  • Как исправить "io.UnsupportedOperation: read"?

    Vindicar
    @Vindicar
    RTFM!
    fp = open(f'captcha_{str(ran)}.jpg', 'wb')
    fp.write(res.content)

    Ты открыл файловый объект для записи, а чтобы его отправить, нужно чтение.
    Или открой объект для модификации ("wb+") и сделай fp.seek(0, 0) после записи, чтобы вернуться в начало файла.
    Или закрой файл, и открой его снова, уже для чтения ("rb").
    Ответ написан
  • Не выполгяется последняя часть кода @bot.callback_query_handler(func=lambda call:True) def callback2(call): почему и как исправить?

    Vindicar
    @Vindicar
    RTFM!
    @bot.callback_query_handler(func=lambda call:True)
    func говорит боту, когда вызывать обработчик. Бот вызывает только ОДИН обработчик (первый подходящий).
    func=lambda call:True означает, что обработчик должен вызываться для ВСЕХ кнопок.
    Научись различать обработчики по call.data. Например, пусть у одной группы кнопок data начинается с "foo.", а у другой - с "bar.".
    item = types.InlineKeyboardButton('4', callback_data='foo.question1')
    item2 = types.InlineKeyboardButton('3', callback_data='foo.question2')

    gotov = types.InlineKeyboardButton('Готов', callback_data='bar.gotov')

    Тогда ты сможешь прописать два обработчика:
    @bot.callback_query_handler(func=lambda call:call.data.startswith('foo.'))

    и
    @bot.callback_query_handler(func=lambda call:call.data.startswith('bar.'))


    Разумеется, вместо foo и bar можно придумать свои префиксы, в том числе многоуровневые (типа callback_data='questions.q1.answer1').
    Ответ написан
    1 комментарий
  • Sqlite3 операционная ошибка, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    c.execute(f"SELECT * from banking_application WHERE name_p IS {pop}")

    За такое бьют линейкой по пальцам. Собственно, ты уже наткнулся на одну из причин почему. Вторая тут.
    Ну и да, IS используется только как IS NULL или IS NOT NULL. Надо вот так:
    c.execute("SELECT * from banking_application WHERE name_p = ?", pop)
    Ответ написан
  • Как обратится к функции вне handler?

    Vindicar
    @Vindicar
    RTFM!
    global resault_func
    resault_func = fi(fil)

    Примерно так и обращайся.
    Ответ написан
    1 комментарий
  • Как корректно разобрать последовательность байт из COM-порта в python?

    Vindicar
    @Vindicar
    RTFM!
    Но почему каша в serial, и как его ответ сделать только bytes без исключения, требует размышления и осознания. Ведь переменная a - это bytes, и binascii.hexlify(a) это тоже bytes...

    Потому что никакой каши нет. Ответ уже только bytes.
    Просто когда выкидывашеь их в консоль, питон (точнее, метод __str__() класса bytes) пытается их представить "как можно читабельнее", т.е. пробует декодировать как ascii-строку что получится, а что не получится, представляет escape-последовательностями \x??.
    Доказать легко:
    b1 = bytes([1,2,3])
    print(b1)  # b'\x01\x02\x03'
    # начиная с Python 3.8 можно указать разделитель в методе hex()
    print(b1.hex(' ')) # 01 02 03
    
    b2 = bytes([0x57, 0x54, 0x46])
    print(b2)  # b'WTF'
    print(b2.hex(' ')) # 57 54 46

    Как видим, работает идентично
    Ответ написан
    Комментировать
  • Как добавлять произвольные данные в extra в logging python?

    Vindicar
    @Vindicar
    RTFM!
    Чем не устраивает вариант с непосредственной подстановкой данных в строку?
    logger.info("New log data: param1 = %s, param2 = %s", value1, value2)

    Просто если у тебя так много разных вариантов подставляемых данных, то проще это решать на уровне отдельного обращения к логгеру.
    Ответ написан
  • Почему не работает replace в python, json?

    Vindicar
    @Vindicar
    RTFM!
    akitaino = input
    Ты не вызываешь функцию input(), чтобы ввести строку с клавиатуры.
    Ты помещаешь ссылку на функцию input() в переменную akitaino.
    Что-то мне подсказывает, что ты не этого хотел.
    Ответ написан
  • Как понять каррирование и частичное применение функции? В чём их различия?

    Vindicar
    @Vindicar
    RTFM!
    plyk, вот частичное применение в упрощённом варианте для двух аргументов.
    def partial(func: typing.Callable[[int, int], int], arg1: int) -> typing.Callable[[int], int]:
        def wrapper(arg2: int) -> int:
            return func(arg1, arg2)
        return wrapper
    
    def add (x: int, y: int) -> int:
        return x + y
    
    def div(x: int, y:int) -> int:
        return x // y
    
    add_42 = partial(add, 42)
    print(add_42(3))  # 42 + 3 = 45
    
    div_120 = partial(div, 120)
    print(div_120(30))  # 120 // 30 = 4


    А каррирование - по сути, каррированная функция вместо выбрасывания ошибки "недостаточно аргументов" возвращает частично применённую функцию для себя и указанных аргументов. Вот очень упрощённая реализация для функции двух аргументов:
    def curry(func: typing.Callable[[int, int], int]) -> typing.Callable:
        def wrapper(*args):
            if len(args) == 2:
                return func(*args)
            elif len(args) == 1:
                return partial(func, args[0])
            else:
                raise Exception('Invalid arguments')
        return wrapper
    
    curried_add = curry(add)
    print(curried_add(32, 23))  # 55
    add_30 = curried_add(30)
    print(add_30(70))  # 30 + 70 = 100
    Ответ написан
    6 комментариев
  • Можно ли написать OS на Python?

    Vindicar
    @Vindicar
    RTFM!
    Нет.
    Ответ написан
    Комментировать
  • Как исправить ошибку в sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    PyCharm выдает ошибку No data sources are configured to run this SQL and provide advanced code assistance. Disable this inspection via problem menu

    Это настройка Pycharm. Можно проигнорировать, скорее всего, или отключить в настройках анализа кода Pycharm.
    Но таблицу он создал и не дает ничего сделать с ней

    А как определил, что не даёт ничего сделать?
    Ответ написан
  • Как считывать из бесконечного Stdout?

    Vindicar
    @Vindicar
    RTFM!
    Проблема в том что ридер зависает, ожидая следующую строчку

    Ридер не знает, это файл закончился, или же просто операция чтения длинная.
    С Go не работал, но очень часто сигналом "конец файла" выступает успешно прочитанная пустая строка. Т.е. и line и err будут пустыми. Ты такой случай не проверяешь. Почитай доки на ввод-вывод в Go, как сигнализируется конец файла?

    Ну и собственно, питоновский скрипт работает вечно. Конец файла вообще наступит?
    Ответ написан
    Комментировать
  • Что нужно написать в 'b', чтобы не произошло экранирование 'a'?

    Vindicar
    @Vindicar
    RTFM!
    Я бы использовал b = repr(a).
    Если нужно убрать кавычки - b = repr(a)[1:-1]
    Ответ написан
    Комментировать
  • Бьет ошибку в линии 11,в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler(commands=['start'])
    def start(message):
         markup = types.ReplyKeyboardMarkup(resize_keyboard= True,)
    item1 = types.KeyboardButton('Клик')
    markup.add(item1)
    bot.send_message(message.chat.id, f'Привет, {message.from_user. first_name}!', reply_markup=markup)

    Всё, что после markup = ..., уже не является частью функции startup(), так как отступ неверный. Учи Питон.
    Ответ написан
    Комментировать
  • Как сделать приложение на питоне, что бы оно используя Steam CMD, при введении ID аддона выдавало файл?

    Vindicar
    @Vindicar
    RTFM!
    Вот это читал?
    Тут имхо можно обойтись без питона, простым bat файлом.
    steamcmd +force_install_dir ../somedir +login anonymous +workshop_download_item %1 validate +quit

    Вместо %1 будет подставлено значение из параметра.
    Т.е. если ты назвал файл getworkshop.bat, то вызывать его надо будет
    getworkshop тут_id

    Ну или вариант, если надо указать и каталог
    steamcmd +force_install_dir "%2" +login anonymous +workshop_download_item %1 validate +quit

    getworkshop тут_id тут\указываешь\каталог
    Ответ написан
    1 комментарий