Задать вопрос
  • Какие бывают типы исключений в python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как настроить черный список для телеграм бота?

    Vindicar
    @Vindicar
    RTFM!
    Вариант 1, простой: оформи проверку в виде функции вида user_id -> bool (true - заблокирован), вызывай в начале каждого обработчика команды. Если вернёт true, то просто return.
    Вариант 1.5: не знаю, как насчёт телеги, а вот бибилиотека для дискорда позволяет для обработчика команды указать функцию вида "можно ли вызывать этот обработчик?". Может, для библиотеки, которую ты используешь, есть что-то похожее?
    Вариант 2: оформи проверку как декоратор, и декорируй свои обработчики. Чуть короче чем вариант 1, если реакция на забаненного пользователя однотипная (например, игнор), то я бы предпочёл его.
    Ответ написан
  • Подключить внешний скрипт Python?

    Vindicar
    @Vindicar
    RTFM!
    В js есть такое- загрузить внешний скрипт.
    А в Python-е есть что-то похожее?

    Сравнили попу с пальцем. То, что вы говорите - это разве что в браузерном JS встречается. В том же node.js так не делается, и очень хорошо что так.

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

    Добавьте к этому необходимость в скриптах миграции (а если "скачать и запустить новую версию" мало? может, надо структуру БД разово подкорректировать, или ещё что?), в умении откатить сломавшееся обновление назад (а то подстава получится для клиентов, если что-то пойдёт не так), в умении определить порядок смены версий (может, у нас скрипты обновления не поддерживает прыжок через три версии?)... и поймете, что это огроменная задача, если решать её как следует, а не как получилось.

    Однако есть и решения, которые часть этих задач берут на себя.
    Например, тот же pip умеет качать пакеты с гитхаба, так что клиент может выполнить что-то типа
    pip install --upgrade git+https://github.com/youracc/yourepo.git@branchname

    Но большая часть задач всё равно остаётся.
    Ответ написан
    Комментировать
  • Как получить КИРИЛИЧЕСКИЙ текст в python3 из PDF?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй pdfplumber, я с ним работал без проблем.
    with pdfplumber.PDF(srcfile) as pdf:
    	pages = [page.extract_text() for page in pdf.pages]
    text = '\n'.join(pages)
    Ответ написан
    1 комментарий
  • Можно ли сделать как-нибудь проще достижения в боте?

    Vindicar
    @Vindicar
    RTFM!
    Подумай, что требуется для описания достижения:
    1. Событие, которое вызвает его получение (сообщение, реакция, заход на канал, и т.д.)
    2. Программный код, который получает данные о событии и обновляет состояние достижения (например, увеличивает счётчик сообщений). Он может сообщить, получено ли пользователем какое-то достижение вместе с этим событием.
    3. База, где хранится информация о достижениях того или иного пользователя. В простейшем случае она будет иметь вид "пользователь-показатель-счётчик", т.е. например "вася - сообщения - 254". Код из п.2 будет читать этот показатель, увеличивать его, и если достигнуто желаемое значение, то выдавать сообщение. Для простоты можно хранить сообщения в отдельной таблице вида "показатель-порог-сообщение", тогда если показатель равен тому или иному порогу, бот должен послать соответствующее сообщение.

    Отсюда получается, что бот или его компонент должен содержать набор маленьких процедур, которые устанавливают связь между событием и показателем. А после обновления показателя может использоваться общая логика, которая проверит, не достигнут ли очередной порог.
    Ответ написан
  • FileNotFoundError: [Errno 2] No such file or directory: 'config.txt', как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Путь у вас относительный. Поэтому он считается относительно текущего рабочего каталога. Этот каталог может совпадать с каталогом, в котором лежит скрипт, а может не совпадать!
    Поэтому лучший способ - вычислять путь самому.
    sys.argv[0] всегда указывает на путь к файлу скрипта.
    Поэтому можно сделать либо так (с помощью os.path):
    os.path.join(os.path.dirname(sys.argv[0]), 'config.txt')

    либо так (с помощью pathlib)
    pathlib.Path(sys.argv[0]).parent / 'config.txt'
    Ответ написан
    Комментировать
  • Почему возникает данная ошибка при запуске любого скрипта питон?

    Vindicar
    @Vindicar
    RTFM!
    SyntaxError: unexpected character after line continuation character

    У тебя в строке где-то болтается символ \ вне строковой константы.
    Знак деления не перепутал, случаем?
    Ответ написан
    3 комментария
  • Определение количества квадратов с пересечением?

    Vindicar
    @Vindicar
    RTFM!
    Размер квадрата известен? Используй скользящее окно.
    Вырезай поочерёдно все фрагменты изображения такого размера, если оно целиком чёрное - то фиксируем квадрат в этой позиции.

    Могут быть ложные срабатывания, если два перекрывающихся квадрата расположены идеально на одной вертикали/горизонтали. Тут нужно искать все срабатывания в этой области, и выбирать крайнее левое/правое или нижнее/верхнее.
    Ответ написан
    Комментировать
  • Помгите я сделал команду clear и мне нужно чтобы могли её использовать люди с определёным правом?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию на has_permissions.
    The permissions passed in must be exactly like the properties shown under discord.Permissions.

    Т.е. запрашиваемые разрешения должны писаться именно так, как перечислено по ссылке. Сравниваем:
    У тебя: manage_message
    По ссылке: manage_messages
    Ответ написан
    Комментировать
  • Как упаковать список в список в Python?

    Vindicar
    @Vindicar
    RTFM!
    1. формируешь список для данного элемента
    itemlist = [name_product, price, quantity, amount]
    2. закидываешь в этот список в общий
    information_products.append(itemlist)

    Удивлён, что это вызвало затрудения.
    Ответ написан
  • Как получить переменную из процесса threading в запросе flask?

    Vindicar
    @Vindicar
    RTFM!
    Потому что в ходе присваивания в name() ты создаешь локальную переменную a, которая перекрывает глобальную.
    Есть два решения:
    1. Простое: вставить в начало name() строку global a, чтобы работать с глобальной переменной
    2. Правильное: обернуть поток в класс, и работать с его экземплярной переменной вместо глобальной.

    К слову, при запуске потока добавь daemon=True, иначе твой поток не даст завершить работу сервера (он же while True).
    Ответ написан
    Комментировать
  • Как сделать два парсера?

    Vindicar
    @Vindicar
    RTFM!
    А переиспользовать один и тот же driver нельзя?
    Ответ написан
    Комментировать
  • Что не так с кодом?Не работает бот?

    Vindicar
    @Vindicar
    RTFM!
    1. Оформляй код как положено, кнопкой </>
    2. Тебе бот прямо говорит в чём дело:
    FileNotFoundError: [Errno 2] No such file or directory: 'static/welcome.webp'
    Ему в текущей рабочей директории нужна поддиректория static, и в ней файл welcome.webp
    Если файл есть, проверь, нет ли опечаток в имени.
    Также обрати внимание, что путь к файлу относительный, а потому зависит от текущей рабочей директории. Поменяй путь на абсолютный, или вычисляй этот путь относительно пути к исполняемому файлу бота.
    Ответ написан
    2 комментария
  • Как получить из трехмерного массива numpy строки совпадающие с указанной?

    Vindicar
    @Vindicar
    RTFM!
    (a == [2,0,2]).all(axis=2)
    a == [2,0,2] даст тебе трёхмерный массив булевых значений - результат поэлементного сравнения, при этом сравнение будет идти по последнему измерению.
    all(axis=2) сгруппирует этот массив по третьему измерению, при этом группа будет истинной, только если все значения в группе истинны. Т.е. только если в этой строке все значения совпали.
    >>> a = np.array([[[1, 0, 0], [2, 0, 1], [2, 0, 2]], [[0, 0, 0], [2, 0, 3], [0, 0, 0]]])
    >>> a == [2,0,2]
    array([[[False,  True, False],
            [ True,  True, False],
            [ True,  True,  True]],
    
           [[False,  True, False],
            [ True,  True, False],
            [False,  True, False]]])
    >>> (a == [2,0,2]).all(axis=2)
    array([[False, False,  True],
           [False, False, False]])
    Ответ написан
    1 комментарий
  • Как убрать пробел в строке print в Питон?

    Vindicar
    @Vindicar
    RTFM!
    А если нужно именно убрать вставку пробела между выводимыми значениями, то делаешь так:
    print('Привет,', name, '!', sep='')
    При этом sep может быть любой строкой, например:
    print('Привет,', name, '!', sep='::')
    выведет "Привет,::Вася::!"

    Аналогично есть параметр end, который указывает, что print() выведет после всех значений. По умолчанию это "\n" - переход на следующую строку, но можно указать end='', и тогда курсор останется на той же строке.
    Ответ написан
    Комментировать
  • Как правильно реализовать ввод данных?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, что именно ты пытаешься сделать?
    > firstnames = input("Введите ваше имя")
    Ты присваиваешь введённое пользователем значение локальной переменной метода input_info() (точнее, его параметру). Питон не предусматривает передачу параметров по ссылке, так что это присвоенное значение никогда выйдет за пределы метода, и будет потеряно, когда метод завершится.
    Далее, зачем while True + break? Чем не устроил простой return?
    Наконец, я бы не стал вносить такие методы в тело класса. Пусть основная программа разбирается с вводом/выводом так, как ей этого хочется, класс, хранящий данные, этим заниматься не обязан.
    class Umar():
        def __init__(self, firstname, lastname, patronymic, age, birthday, jobs, car):
            ... # тут код инициализации класса
    #эти функции можно сделать методами класса, 
    # но я бы рекомендовал оставить их вне класса,
    # так как способы ввода/вывода варьируются чаще, 
    # чем способы хранения данных.
    # красивый вывод содержимого класса
    def pretty_print_umar(u: Umar):
        print('Имя:', u.firstname)
        ... # ну и так далее
    # ввод данных с клавиатуры и создание по ним экземпляра класса
    def input_umar() -> Umar:
        firstname = input('Введите имя [Enter - отмена]:')
        if not firstname:
            return
        # и так далее для остальных полей, а затем
        return Umar(firstname, ...)
    Ответ написан
  • Почему не работают две одинаковые команды в разных группах?

    Vindicar
    @Vindicar
    RTFM!
    Дай угадаю, работает только первый или только второй метод, и если поменять их местами, начинает работать другой?
    Переименуй один из методов balance, ты же всё равно указываешь параметр name в декораторе.
    Ответ написан
    1 комментарий
  • Имеется ли возможность в openssl сохранить сигнатуру в файле, который подписали?

    Vindicar
    @Vindicar
    RTFM!
    Боюсь, это проблематично, так как после добавления сигнатуры файл изменится, и подпись станет невалидной. И даже если мы выкусим подпись перед проверкой (а не факт, что мы сходу поймём где подпись!), то мелочи вроде лишнего перевода строки всё равно могут помешать нам восстановить исходный вид файла.
    Ответ написан
  • Как сделать так, чтобы команды автоматически добавлялись в help?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, если ты пропишешь docstring у функции, реализующей команду, то этот docstring будет использован в качестве справки. При этом все команды в отдельном Cog-классе уже будут сгруппированы вместе.
    Во-вторых, у декоратора @bot.command() есть параметр help - если я верно понял, он позволяет задать описание команды явно, вместо ииспользования docstring.
    Ответ написан
  • Как расположить несколько текстов в разных местах в label в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Используй несколько label'ов или рисуй текст сам на canvas'е.
    Ответ написан