Ответы пользователя по тегу Python
  • Как вытащить значение из потока?

    Vindicar
    @Vindicar
    RTFM!
    Ну конечно start() возвращает None, чего ты ожидал? На момент завершения start() поток ещё неизвестно сколько работать будет, откуда start() знать, что он в итоге вернёт?

    Сделай класс-наследник Thread(), и переопредели в нём метод run().
    Тогда ты сможешь объявлять в этом классе свои поля, и использовать их как захочешь - например, для возврата результатов.
    Ответ написан
  • Телеграм-бот. Как сохранить второе сообщение от пользователя?

    Vindicar
    @Vindicar
    RTFM!
    У тебя должен быть отдельный обработчик входящих сообщений, а не часть обработчика нажатия на кнопку..
    При этом бот должен помнить, ведёт ли данный пользователь игру в настоящий момент, или нет.
    Ответ написан
  • Почему не работает прерывание программы при нажатии кнопки?

    Vindicar
    @Vindicar
    RTFM!
    getch() не позволяет читать клавиши-модификаторы, типа Alt. Используй модуль keyboard.
    Ответ написан
    Комментировать
  • Почему не работает рандомайзер в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты из всего модуля random импортируешь только одну функцию random(), а использовать пытаешься random.randint(). Делай просто import random.
    Ответ написан
    Комментировать
  • Как умножить списки разной длины в python?

    Vindicar
    @Vindicar
    RTFM!
    for i in index_list:
        mult *= rnd_list[i]

    Должно быть правильно. Если вываливается IndexError - значит, в index_list есть индексы, которые не вписываются в rnd_list - либо >N-1, либо <-N. Уточняй условие задачи, что делать, если встретились такие индексы.
    Ну и можно для уточнения ситуации сделать так:
    N = len(rnd_list)
    for i in index_list:
        try:
            value = rnd_list[i]
        except IndexError:
            print(f'Не удалось взять элемент с индексом {i}, он не в диапазоне {-N}...{N-1}. Игнорирую индекс.')
        else:
            mult *= value
    Ответ написан
    2 комментария
  • Из за чего команда 9Abelora выполняется первее чем raspisanie?

    Vindicar
    @Vindicar
    RTFM!
    Изучай документацию, а не "уроки" с ютуба.
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
       ...

    func принимает функцию, которая должна по параметру call (сведения о нажатии кнопки) определить, будет ли данный обработчик обрабатывать это нажатие. Соответственно, функция вида lambda call: True всегда будет отвечать "да, я буду обабатывать!".

    При этом бот вызовет первый "согласившийся" обработчик, и ТОЛЬКО его. Как следствие, наличие одного обработчика с func=lambda call: True блокирует все нижележащие обработчики, так как этот "всеядный" обработчик будет брать на себя все нажатия кнопок (независимо от того, понимает ли он их). До остальных обработчиков дело просто не дойдёт.

    Чтобы это разрулить, надо прописывать не lambda call: True, а функцию, которая реально будет различать, какой набор кнопок у пользователя, и какая кнопка была нажата. Самый простой способ это сделать - сделать этакую иерархию в строке call.data. Например:
    9a.tomorrow
    9a.week
    9a.today
    10a.tomorrow
    10a.week
    10a.today

    Тогда ты сможешь прописать обработчики вида:
    @bot.callback_query_handler(func=lambda call: call.data.startswith('10a.'))
    def callback_inline_for_10a(call):
       ...  # тут обрабатываем кнопки для 10А
    
    @bot.callback_query_handler(func=lambda call: call.data.startswith('9a.'))
    def callback_inline_for_9a(call):
       ...  # тут обрабатываем кнопки для 9А


    Ну а создание кнопок, соответственно, будет иметь вид
    item1 = types.InlineKeyboardButton("Домашнее задание на завтра", callback_data='10a.tomorrow')
    Ответ написан
    4 комментария
  • Не отправляются фотографии пользователю в библеотеке telebot, что делать?

    Vindicar
    @Vindicar
    RTFM!
    def raspisanie(message):
    def raspisanie(call):
    Ничего странного не замечаешь?
    Ответ написан
  • Можно ли в качестве значения для поля класса данных python использовать генератор?

    Vindicar
    @Vindicar
    RTFM!
    r1 = Row()
    r1.cells = generator_1(3)

    Ну во-первых, это выглядит скорее как обычная переменная, а не как поле класса. Будь это хотя бы вида
    r1 = Row(table, 3) # 3я строка таблицы table, это имело бы смысл

    Во-вторых, что за "восход солнца вручную"?
    for i in range(5):  # нам нужно знать длину строки?
        cell_val = next(r1.cells, None)
        print (cell_val)

    Почему не сделать
    for cell_val in r1:
        print (cell_val)

    если генераторы по определению заточены под итерацию по ним.

    В-третьих, реализация cut_value откровенно неудачная - это должно быть property. Сейчас, если value изменится, cut_value уже не будет ему соответствовать. Придётся помнить, что нужно изменять и то, и то.

    Ну и главное - генераторы одноразовые! Тебе придётся явно перезадавать их после использования, что убивает весь смысл.

    В целом, я бы сказал, что ты не понимаешь главную идею того, зачем вообще наворачивают подпрограммы, классы и прочие абстракции: спрятать сложность реализации за простым интерфейсом. Классом должно быть проще пользоваться, чем переписать его с нуля. В приведённом коде это не так.

    Вообще, если тебе интересно, как организовать массив - посмотри в сторону numpy. Там очень удобно сделана работа с массивами, и даже небольшого подмножества фич будет достаточно. В общем-то, возникает вопрос, а так ли нужны отдельные классы Row и Column.
    Ответ написан
  • Как отправить сообщений в определенное время telebot?

    Vindicar
    @Vindicar
    RTFM!
    телебот - это синхронная библиотека. Он не предусматривает длительной работы обработчиков.
    Так что тебе придётся выносить ожидание момента (тот же пакет schedule) в отдельный поток.
    Но я без понятия, безопасно ли обращаться к методам telebot из других потоков.
    Ответ написан
  • Оптимально ли использовать ветку if elif else в callbacl query handler?

    Vindicar
    @Vindicar
    RTFM!
    1. Можно указывать фильтр на call.data при регистрации callback
    2. Если есть повторяющиеся действия - посмотри, нельзя ли использовать коллекцию (например, словарь, в котором лежат обработчики отдельных вариантов).
    Ответ написан
    Комментировать
  • Как решить проблему с выделением памяти в субпроцессе?

    Vindicar
    @Vindicar
    RTFM!
    Либо файл большой, либо памяти мало. Нужно проверить потребление оперативки (как - зависит от ОС).
    А дальше...
    Либо смотреть, нельзя ли конвертировать постранично, например.
    Либо пытаться уменьшить потребление ОЗУ в других местах (в основном скрипте?)
    Либо раскошелиться на больший объём памяти.
    Ответ написан
    Комментировать
  • Почему может выдавать ошибку в Python Bot?

    Vindicar
    @Vindicar
    RTFM!
    await message.delete
    Наверно, всё-таки await message.delete()?
    Ответ написан
    Комментировать
  • Python Как сделать, чтобы для определенного аудио выполнялось свое условие?

    Vindicar
    @Vindicar
    RTFM!
    Переделай песни в словарь вида
    options = {
      "Неизвестная песня.mp3": "123",
      "Неизвестная песня 2.mp3": "456",
      "Неизвестная песня 3.mp3": None,  # у этой песни нет сообщения
    }
    
    # ну а когда нужно определить песню
    track_name = random.choice(list(options.keys()))
    # audio_data = open(track_name, 'rb')  # зачем это, кстати? Ты отдаёшь имя файла всё равно
    option = options.get(track_name) # получаем сообщение для песни
    bot.send_audio(message.chat.id, track_name):
    if option is not None:
        pass  # делаешь что тебе надо с option
    Ответ написан
    Комментировать
  • Как проверить, есть ли в строке язык, кроме английского?

    Vindicar
    @Vindicar
    RTFM!
    Поищи описание диапазонов юникода, может, получится по кодам символов работать. Но да, при такой формулировке задачи - только whitelist.
    Ответ написан
    Комментировать
  • Как правильно работать с datetime.date()?

    Vindicar
    @Vindicar
    RTFM!
    Перепроверь с чем ты пытаешься работать - с классом datetime.datetime и его полем date, или же с модулем datetime и его классом date.
    Судя по ошибке - ты работаешь c первым, а думаешь что со вторым.
    Перепроверь импорт модуля. Ты его не показал, но я готов спорить что там from datetime import datetime.
    Ответ написан
    3 комментария
  • Программа останавливается на определенном этапе после ее запуска, в чем ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Что значит "закрывается и дальше не работает"?
    У тебя после вывода последнего сообщения в цепочке программа ничего не делает и просто завершается. Если ты запускаешь exeшник вне терминала, то он создаёт своё окно консоли - которое, разумеется, закроется по завершении программы.
    Если тебе нужно, чтобы окно не закрывалось - сделай так, чтобы программа не завершалась по выходу из чудо-if. Добавь хотя бы input('Нажмите Enter чтобы закончить игру') в конце.
    Ответ написан
    Комментировать
  • Как обновить переменную в цикле?

    Vindicar
    @Vindicar
    RTFM!
    У тебя и test и out ссылаются на один и тот же объект-список, поэтому когда ты его модифицируешь, у тебя не остаётся копии, чтобы начать всё с начала.
    Убери параметр из подпрограммы, и делай test = out.copy() в начале и при "перезапуске".
    Ответ написан
    1 комментарий
  • Как сделать паузу?

    Vindicar
    @Vindicar
    RTFM!
    file.flush() после записи?
    Ответ написан
  • Как обслуживать юзеров по очереди телебот?

    Vindicar
    @Vindicar
    RTFM!
    global user_id
    Ну как бы вот виновник. Глобальные переменные. Они общие на всего бота и на всех пользователей. Если тебе нужно дифференцировать пользователей - делай это сам.
    Делай хранилище "ключ-значение", где ключ - ID пользователя, значение - хранимые для этого пользователя данные. При обработке сообщения читай ID пользователя, доставай из хранилища данные, и уже сообразно им обрабатывай сообщение.
    Таким хранилищем может быть простой словарь (если не нужно сохранять состояние между перезапусками бота), БД или ещё что.

    Не знаю, есть ли в telebot реализация Finite State Machine, но обычно для реализации сценариев используют её. Идея та же - для каждого юзера храним его текущее состояние (шаг в сценарии) и ассоциированные с ним данные.
    Ответ написан
    2 комментария
  • Почему индекс нулей в списке равен нулю?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в строках массива несколько нулей. Метод index() по умолчанию находит только первое искомое значение. Если бы ты почитал документацию, ты бы это понял, и увидел, как это обойти.

    list.index(x[, start[, end]])

    Return zero-based index in the list of the first item whose value is equal to x. Raises a ValueError if there is no such item.

    The optional arguments start and end are interpreted as in the slice notation and are used to limit the search to a particular subsequence of the list. The returned index is computed relative to the beginning of the full sequence rather than the start argument.


    Вообще, раз уж ты ручками перебираешь строки и ячейки матрицы, используй enumerate().
    for i_row, row in enumerate(grid):  # row == grid[i_row]
        for i_col, value in enumerate(row):  # value == row[i_col]
            # далее сам
    Ответ написан
    1 комментарий