Ответы пользователя по тегу Python
  • Как получить значение в объекте slice(__getitem__)?

    Vindicar
    @Vindicar
    RTFM!
    За один шаг - никак. Потому что это две операции.
    x = l[:][1]
    # это то же самое, что и
    tmp = l[:]  # l.__getitem__(slice(None, None, None))
    x = tmp[1]  # tmp.__getitem__(1)

    У тебя есть два выхода. Либо ты первым __getitem__ возвращаешь какой-то специальный промежуточный объект, который уже своим __getitem__ принимает 1 и выполняет нужное действие.
    Либо ты меняешь способ обращения к объекту на кортеж:
    x = l[:, 1]
    Тогда у тебя __getitem__ получит кортеж из двух элементов: (slice(None, None, None), 1)
    Ответ написан
    Комментировать
  • Telegram bot, отправка текущего времени в сообщении?

    Vindicar
    @Vindicar
    RTFM!
    Модуль datetime в помощь. В частности, класс datetime.datetime, его методы now() и strftime().
    Только нужно иметь ввиду, что этот класс вернёт текущее время по часам того компа, на котором запущен бот, а не по часам клиента.
    Ответ написан
    Комментировать
  • Как реализовать на python в виде списка смежности такой граф?

    Vindicar
    @Vindicar
    RTFM!
    Если именно список смежности - то это список пар вида "исходная вершина - конечная вершина". Тогда для связи между A и C будет две пары - одна в одну сторону, одна в другую.
    С точки зрения структур данных это будет список кортежей (я бы использовал typing.NamedTuple или collections.namedtuple, ну или хотя бы dataclass).

    Если речь про таблицу смежности, то будет обычная двухмерная таблица (например, список списков), только она будет несимметричной. Т.е. наличие 1 в элементе i,j не означает наличия 1 в элементе j,i.
    Ответ написан
  • Как расставить в тексте ` вокруг символов, которые не являются буквами (русскими или англ)?

    Vindicar
    @Vindicar
    RTFM!
    1. Вот прям вообще все не буквы? В том числе пробелы? В том числе точки и запятые? В том числе цифры?
    2. А если несколько не-букв подряд? Оборачивать все или каждую?

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

    Vindicar
    @Vindicar
    RTFM!
    1. Запусти бота.
    2. Задействуй пакет watchdog
    3. В обработчике событий watchdog проверяй, что событие нас интересует, и говори боту отправить файл.
    Ответ написан
    Комментировать
  • Как реализовать отправку сообщения ботом при обновлении бд?

    Vindicar
    @Vindicar
    RTFM!
    pochka3648, сделай своё API. Например, первый бот слушает сокет, второй к нему коннектится, и пишет в сокет данные.
    Если не требуется мгновенное оповещение, пусть первый бот периодически проверяет таблицу на наличие новых записей.
    Ответ написан
    Комментировать
  • Способ безопасного выполнения sql - запросов от пользователей?

    Vindicar
    @Vindicar
    RTFM!
    будет ли такой подход разумным с точки зрения производительности

    Он будет разумным с точки зрения безопасности и лёгкости исправления ошибок пользователя.
    Производительность, имхо, должна быть на втором месте в таких вещах.
    Ответ написан
    Комментировать
  • TypeError: cannot unpack non-iterable NoneType object как исправить?

    Vindicar
    @Vindicar
    RTFM!
    У тебя вполне возможно, что в four_squares() не отработает ни один return. В этом случае функция неявно вернёт None. А распаковать None как кортеж нельзя.
    Хотя бы сделай так:
    result = four_squares(i)
    if result is not None:
        a, b, c, d = result
        ...  # тут работаешь с a,b,c,d
    else:
        ...  # а тут решаешь, что делать, если функция вернула None
    Ответ написан
    3 комментария
  • Почему не работает код дальше?

    Vindicar
    @Vindicar
    RTFM!
    dp.register_callback_query_handler(go1, lambda call: True)

    Потому что ты сказал "А всё, что не обрабатывается вышележащими обработчиками, пускай обрабатывает go1". Как следствие, до go2 дело не доходит.
    Чини lambda call: ..., чтобы правильно определял, какие события отдавать go1.
    Ответ написан
    Комментировать
  • Как отправлять одно сообщение а не несколько?

    Vindicar
    @Vindicar
    RTFM!
    Голову включить, для начала.
    Как по-твоему, какой вызов выполняет отправку сообщения? Правильно, interaction.send().
    Этот вызов у тебя в цикле for member in guild.humans, поэтому для каждого участника сервера будет вызвано interaction.send(), а значит, отправлено отдельное сообщение.
    Значит, если хочешь отправлять сведения однажды - вынеси вызов из цикла.
    А чтобы не потерять данные, которые ты в цикле собираешь - помещай их в список.
    После цикла собери этот список в строку через join(), и отправь эту строку одним вызовом send().
    Ответ написан
    3 комментария
  • Disnake Как получить загруженное изображение из сообщения?

    Vindicar
    @Vindicar
    RTFM!
    Как? Читать документацию, а не клянчить готовый код.
    message - экземпляр класса Message, у него есть свойство attachments. Это свойство содержит список объектов Attachment, у которых есть много полезных тебе полей.
    В частности, url (думаю, комментарии не требуются) и content_type (позволяет понять, что за файл приложен).
    Ну и полезный метод с говорящим названием save().
    Ответ написан
    Комментировать
  • Как сделать что бы бот выдавал сколько пользователь в боте?

    Vindicar
    @Vindicar
    RTFM!
    В обработчике команды /start записывать в базу текущую дату (например, в виде timestamp).
    По запросу узнать текущую дату, получить дату из базы, вычесть, перевести в дни.
    См. модуль datetime.
    Ответ написан
    Комментировать
  • Как реализовать задуманное когда условий три и значений три?

    Vindicar
    @Vindicar
    RTFM!
    ROCK = 0  # именно целые числа, именно подряд, и именно начиная с нуля
    PAPER = 1
    SCISSORS = 2
    
    VICTORY = [
        # номер строки - ход игрока 1, 
        # номер столбца - ход игрока 2
        # значение - какой игрок победил
        #к, н, б
        [0, 1, 2],  # камень
        [2, 0, 1],  # ножницы
        [1, 2, 0],  # бумага
    ]
    
    # задаём ходы игроков - у тебя эти значения придут из бота, я так понимаю
    player1 = random.choice([ROCK, PAPER, SCISSORS])
    player2 = random.choice([ROCK, PAPER, SCISSORS])
    
    # определяем результаты
    outcome = VICTORY[player1][player2]
    if outcome == 0:
        print("Ничья")
    elif outcome == 1:
        print("Победил игрок 1")
    elif outcome == 2:
        print("Победил игрок 2")


    Можно, конечно, сократить при желании. Но так понятно.
    А у тебя не работает, потому что ты с какого-то перепугу решил, что запись
    win1 = (v1 > v2), (v2 > v3), (v3 > v1)
    даст тебе одно логическое значение, а не кортеж из трёх. Сюрприз, непустой кортеж всегда истинный.
    Ответ написан
    6 комментариев
  • Как динамически создавать таблицы при помощи Peewee в Python?

    Vindicar
    @Vindicar
    RTFM!
    динамически меняющееся количество столбцов

    You are doing it wrong. (c)
    Если тебе требуется динамически меняющееся количество столбцов, ты неправильно спроектировал базу данных.
    Лучше опиши задачу, которую ты пытаешься решить.
    Ответ написан
  • Как записать в список?

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

    Vindicar
    @Vindicar
    RTFM!
    s2 = word
    Ты перезаписываешь s2 последним найденным словом. Вместо этого заведи список, и складывай найденные слова в список через метод .append().
    Ответ написан
    Комментировать
  • Как реализовать settings.py?

    Vindicar
    @Vindicar
    RTFM!
    Я для таких вещей люблю использовать JSON и датаклассы. Хорошо работает, если у тебя в настройках только простые типы (целое число, дробное число, строка, булево значение), из коллекций - списки.
    Описываешь настройки как датакласс
    import dataclasses
    
    @dataclasses.dataclass
    class Settings:
        x: int = 0  # имя, тип настройки, значение по умолчанию
        y: int = 0
        name: str = "Безымянный"

    Тогда загрузку из файла можно сделать так:
    import sys
    import pathlib
    import json
    
    # я предполагаю, что ты будешь хранить настройки в каталоге скрипта
    APP_DIR = pathlib.Path(sys.argv[0]).parent.resolve()  # путь к каталогу скрипта
    CFG = APP_DIR / 'settings.json'  # путь к файлу конфига
    settings = Settings()  # создаём настройки по умолчанию
    try:
        with CFG.open('rt', encoding='utf-8') as cfg:  # открываем файл (закроется сам по выходу из with)
            data = json.load(cfg)  # разбираем файл как JSON
        settings = dataclasses.replace(settings, **data)  # обновляем настройки значениями из файла
    except Exception as err:
        print('Ошибка загрузки настроек:', err)  # выводим сообщение об ошибке
    # но выполнение кода продолжается в любом случае
    # у нас есть либо settings с значениями по умолчанию, либо settings, обновлённый из файла
    print(settings.name, settings.x, settings.y)  # пример использования объекта settings
    settings.name = 'Имя'  # значения в объекте можно менять
    settings.x, settings.y = 10, 20


    Для сохранения можно будет аналогично вытащить значения всех полей из объекта:
    try:
        data = dataclasses.asdict(settings)  # превращаем объект в словарь
        with CFG.open('wt', encoding='utf-8') as cfg:  # открываем файл (закроется сам по выходу из with)
            json.dump(data, cfg, ensure_ascii=False, indent='  ')  # записываем словарь в файл в формате JSON
    except Exception as err:
        print('Ошибка сохранения настроек:', err)  # выводим сообщение об ошибке
    Ответ написан
    Комментировать
  • Как отделить числа от букв в списке?

    Vindicar
    @Vindicar
    RTFM!
    Пробуй перевести в int, лови исключение ValueError. В зависимости от исхода (было/не было) добавляй в итоговый список новый элемент.
    Ответ написан
    Комментировать
  • Как повысить четкость распознавания текста tesseract?

    Vindicar
    @Vindicar
    RTFM!
    Предварительно обрабатывай изображение.
    Выдели то место, где может находиться искомый текст, сделай нормализацию гистограммы (увеличь контраст). Должно помочь.
    Также можно попробовать адаптивное пороговое преобразование.
    Ответ написан
    Комментировать