Задать вопрос
  • Как извлечь строку из файла?

    Vindicar
    @Vindicar
    RTFM!
    Нет понятия "извлечь строку". Есть понятие "прочитать строку" и "удалить строку".
    В случае с "удалить" подразумевается, что мы
    а) либо перезаписываем файл целиком,
    б) либо перезаписываем всё, что идёт после начала удаляемой строки (т.е. копируем то, что после конца удаляемой строки) и обрезаем конец файла.

    Вообще текстовые файлы - весьма неблагодарная штука для редактирования. Лучше в таких случаях использовать либо другой формат данных, либо вообще другое хранилище.
    Ответ написан
    2 комментария
  • Почему возникает ошибка error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'?

    Vindicar
    @Vindicar
    RTFM!
    _, image = cap.read()
    Не _, а success_code, то бишь признак успешности чтения. Проверь, читается ли у тебя вообще кадр с камеры.
    Ответ написан
    Комментировать
  • Как между асинхроными функциями делиться и перекидывать переменные и их значения?

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

    Собственно, в аиограме есть механизм Finite State Machine, который как раз про организацию сценариев, с отслеживанием того, на каком этапе находится конкретный пользователь.

    Но для его использования нужно знать питон на уровне немножечко повыше "Если я пытаюсь исплользовать return то код дальше становится недоступным".
    Ответ написан
    Комментировать
  • Из трёх похожих друг на друга команд, создалась только одна, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Отступы! У тебя всё, что после mathsminus() определено ВНУТРИ mathsminus(). Проверь отступы в начале строк.
    Ответ написан
    1 комментарий
  • Как создать список из картинок и текста и выводить рандомным способом?

    Vindicar
    @Vindicar
    RTFM!
    Ну про random.choice() ты знаешь. В чём проблема-то?
    Если нужно соответствие картинки и текста, то просто храни текст и картинку одним элементом списка - например, через кортеж.
    tarot_list = [
        ('image1.jpg', 'Текст 1'),
        ('image2.jpg', 'Текст 2'),
    ]

    Тогда потом просто делаешь:
    image, text = random.choice(tarot_list)
    и вперёд!
    Ответ написан
  • Почему не получается, если миновать задание переменной, и сразу подставить int(input) в print, вместо переменной a?

    Vindicar
    @Vindicar
    RTFM!
    Потому что input() требует ввода данных с клавиатуры. Если ты вызываешь input() несколько раз - вводить придётся несколько значений. У тебя 4 раза встречается a, так что тебе придётся 4 раза вводить одно и то же значение если ты a заменишь на вызов int(input()). ИМХО, это уже причина так не делать.
    Ответ написан
    Комментировать
  • Как организовать взаимодействие классов?

    Vindicar
    @Vindicar
    RTFM!
    Ну вот так абстрактно мало что можно посоветовать.
    Хотя взаимодействие B, C и D говорит о неудачном распределении обязанностей.
    Есть два варианта.

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

    Б) Один класс (роутер/машина состояний) определяет, какой сценарий взаимодействия с пользователем сейчас выполняется. Другие классы реализуют по одному сценарию взаимодействия каждый, предоставляя интерфейс, хранение данных и выполнение операций в рамках сценария. Они не реализуют переход между сценариями сами - вместо этого они оповещают роутер о желаемом переходе. А тот уже оповещает текущий сценарий о завершении, подгружает другой сценарий (экзепляр класса) и оповещает его о начале работы.
    Ответ написан
  • Из-за чего возникла ошибка 'TypeError: Bot.send_message() missing 1 required positional argument: 'text''?

    Vindicar
    @Vindicar
    RTFM!
    await Bot.send_message(message.from_user.id, message.text)

    Ты пытаешься вызвать метод класса Bot, а не экземпляра bot.

    Поясню. В питоне методы устроены довольно прямолинейно:
    class Test:
        def test(self, x):
            print(f"Я {self} и я получил {x}")
    
    t = Test()  # создаём экземпляр
    t.test(42)  # Я <__main__.Test object at 0x000001BB195CBC70> и я получил 42
    # это тоже сработает, и это практически эквивалентно вызову выше
    Test.test(t, 42)  # Я <__main__.Test object at 0x000001BB195CBC70> и я получил 42
    # а это - то, что попытался сделать ты:
    Test.test(42)  # TypeError: Test.test() missing 1 required positional argument: 'x'
    # потому что вызван метод класса, а не объекта, и его первый параметр (42) интерпретирован как self
    Ответ написан
    4 комментария
  • Как сделать проверку if на тип переменной?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, оператор is проверяет идентичность объектов. Учи язык.
    a = [1, 2, 3]
    b = [1, 2, 3]
    print(a == b)  # True - списки имеют одинаковое содержимое
    print(a is b)  # False - a и b ссылаются на разные объекты-списки, а не на один и тот же.


    Если тебе нужно узнать, содержит ли переменная ссылку на объект указанного типа, используй isinstance().
    a = 1
    b = 1.0
    print(isinstance(a, int), isinstance(a, float))  # True False - a это int, но не float
    print(isinstance(b, int), isinstance(b, float))  # False True - b это не int, это float
    print(isinstance(a, (int, float)))  # True - a является чем-то из двух: или int, или float

    Но это работает только для значений корректного типа - это НЕ позволит проверить, содержит ли строка корректное представление числа, к примеру. Для этого либо используй try-except, либо регулярные выражения. Только вот в except не стоит писать pass - нужно подумать, что программа должна делать, если введено не число.
    Ответ написан
    1 комментарий
  • Бот обратной связи на Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, "не получилось" - это, конечно, офигенно детальное и полезное описание проблемы.

    Во-вторых, я подозреваю, что дело вот в этом:
    photo=message.photo[0].file_id
    Наверняка если к сообщению не приложено фото, коллекция photo пуста, тогда попытка обращения к нулевому элементу выкинет исключение, так как этого нулевого элемента просто нет. Проверяй, есть ли вообще что-то в message.photo.
    Ответ написан
    Комментировать
  • Как вызвать функции зависимо от колбека?

    Vindicar
    @Vindicar
    RTFM!
    У объекта call (тип CallbackQuery) есть свойство data. Ты его можешь задать при создании кнопки (которое почему-то опущено в коде), тогда оно будет иметь значение, соответствующее нажатой кнопке. А дальше просто сравниваешь это значение с желаемым.
    Ответ написан
    3 комментария
  • Можно ли сгенерированный Literal передать в параметры функции?

    Vindicar
    @Vindicar
    RTFM!
    поэтому о статическом литерале речи не идет

    А ничего, что литералы, как и большинство инструментов type-checking, предназначены для статической проверки кода? Интерпретатор их игнорирует при выполнении. Их использование в discord.py, хотя и красивое, но всё же нестандартное.
    Поэтому само сочетание "динамический литерал" есть бессмыслица.

    Принимай жанр как строку, и проверяй её самостоятельно, либо, если очень хочется, прописывай для жанра свой конвертер.
    Ответ написан
    Комментировать
  • Как в reply_markup добавить больше переменных с копками?

    Vindicar
    @Vindicar
    RTFM!
    bot.send_photo(message.chat.id, photo, " Выберите нужную функцию:",
    parse_mode="html", reply_markup=tg, info)

    reply_markup=tg - аргумент, переданный по имени
    info - аргумент, переданный позиционно.
    Питон не позволяет указывать позиционные аргументы ПОСЛЕ именованных. Укажи для info имя аргумента, в который ты хочешь передать это значение, по аналогии с reply_markup= или parse_mode=.
    Ответ написан
    Комментировать
  • Как разделить текст на части?

    Vindicar
    @Vindicar
    RTFM!
    Т.е., если переформулировать: разбить текст по символу перевода строки так, чтобы размер первой части не превышал N символов?
    text = """Текст слово Текст
    Новая строка
    Ещё новее строка"""
    N = 12
    
    start, rest = text[:N], text[N:] # отделяем ту часть текста, где мы ищем перевод строки, от остатка
    first, _, second = text.rpartition('\n') # ищем последний перевод строки в этой части - до него "начало"
    last = (second + rest) if second else rest # "конец" собираем из того что после перевода строки и остатка
    print('-'*10)
    print(first)
    print('-'*10)
    print(last)
    print('-'*10)

    Если перевода строки в первой части текста нет, то текст будет просто разрезан по N символам.
    Ответ написан
    2 комментария
  • Как из main.py запустить несколько других файлов .py, чтобы они работали параллельно?

    Vindicar
    @Vindicar
    RTFM!
    Другие идеи есть в документации, просто её надо читать.

    subprocess.Popen() БЕЗ использования wait() или communicate().
    Ответ написан
  • Можно ли узнать возврат функции при использовании многопоточности Thread на Python?

    Vindicar
    @Vindicar
    RTFM!
    Лучше используй долгоживущие потоки и пару queue.Queue. Из первой потоки в цикле извлекают задания и обрабатывают их, во вторую складывают ответы. Главный поток - наоборот, кладёт задания в первую очередь и извлекает ответы из второй.

    См. также: паттерн "поставщик-потребитель".
    Ответ написан
    Комментировать
  • Как сделать вывод в лог logging python?

    Vindicar
    @Vindicar
    RTFM!
    Добавь помимо FileHandler еще и StreamHandler.

    И да, я бы не советовал настраивать логи в конструкторе класса. Пусть класс использует getLogger() и пишет в лог, но определять уровни и места, куда лог пишется, должна основная программа.
    Ответ написан
    Комментировать
  • Как убрать лишние знаки?

    Vindicar
    @Vindicar
    RTFM!
    Ещё один не выучил основы языка, но пытается работать с БД.

    fectchone() возвращает кортеж, в твоём случае кортеж с одним элементом. Скобки - это строковое представление кортежа. Как вытащить значение из кортежа - читай по ссылке.

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

    Vindicar
    @Vindicar
    RTFM!
    asyncio создаёт цикл-реактор (loop) только для главного потока. Если тебе нужен отдельный реактор в другом потоке (что само по себе повод остановиться и задуматься - нахрена?), создавай его сам в начале потока, потом уже вызывай асинхронный код.
    См. asyncio.new_event_loop() и asyncio.set_event_loop().
    Ответ написан
    1 комментарий