Задать вопрос
Ответы пользователя по тегу Python
  • Из за чего появляется ошибка в строке 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.
    Что-то мне подсказывает, что ты не этого хотел.
    Ответ написан
  • Можно ли написать 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.
    Но таблицу он создал и не дает ничего сделать с ней

    А как определил, что не даёт ничего сделать?
    Ответ написан
  • Что нужно написать в '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(), так как отступ неверный. Учи Питон.
    Ответ написан
    Комментировать
  • Запутался в блоках if и циклах. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    У тебя только один цикл - повторять попытки ввода номера клетки, пока пользователь что-то не введёт. Больше он ничего не делает.
    Тебе нужен ещё один, который охватывает всю логику хода. Можешь сделать его вечным, и выходить из цикла по break, когда пользователь выиграет/проиграет.

    И да...
    locals()[numb + str(bomb_meaning)]
    Освой списки. Вот прямо сейчас отложи игру и освой списки.
    Ответ написан
    Комментировать
  • Цикл для обработчика кнопок?

    Vindicar
    @Vindicar
    RTFM!
    def handle_button(call_data: str):
            try:
                fileid = int(call_data) - 1  # определяем id файла по значению call_data
            except ValueError:
                return
            markup = InlineKeyboardMarkup()
            bttn_contact = (InlineKeyboardButton(text = " Связаться с менеджером", callback_data = "contact")) 
            markup.add(bttn_contact)
            bttn_home = (InlineKeyboardButton(text = " Начало", callback_data = "home"))
            markup.add(bttn_home)
            with open(f'data/{fileid}_info.txt', 'r', encoding = "utf-8") as file:
               content = file.read()
            # if тут не нужен, сработает и без него.
            for x in range(0, len(content), 4095):
                bot.send_message(call.message.chat.id,content[x:x+4095],reply_markup=markup)

    Ну а в обработчике просто дергаешь handle_button(call.data).
    Ответ написан
    Комментировать
  • Как решить эту задачу на python?

    Vindicar
    @Vindicar
    RTFM!
    Первая задача решается легко и непринуждённо.
    Рассмотри каждую кривую по отдельности, и реши, должна ли точка в искомой области лежать НАД кривой (y > f(x)) или ПОД кривой (y < f(x)). Объедини полученные условия операторами and.
    Ответ написан
    Комментировать
  • Чем отличаются условные операторы в Python?

    Vindicar
    @Vindicar
    RTFM!
    Поведение кода НЕ одинаковое.
    Если ты ввёл неправильное число, то первый код только выведет "конец игры", тогда как второй напишет "не угадал", а потом "конец игры". Что требуется по условию задачи - тебе виднее.

    А вообще я бы сказал, что правильно сделать иначе. У тебя два if подряд с противположными условиями - тут просится if-else.
    fathers_number = 5
    sons_number = int(input("Какое число я загадал? "))
    if sons_number == fathers_number:
        print("Угадал!")
    else:
        print("Не угадал!")
    
    print("Конец игры")
    Ответ написан
    1 комментарий