• Как лучше использовать библиотеки python в нескольких файлах с кодом?

    Vindicar
    @Vindicar
    RTFM!
    Импортируй как обычно, в каждом файле.
    Универсальный файл с импортами только осложнит дело, но не даст никакого выигрыша в читаемости кода, так как в разных файлах будут требоваться разные модули.

    Также посоветую придерживаться норматива PEP8 в плане порядка импорта:
    Сначала импорты стандартных модулей.
    Потом импорты сторонних библиотек (то что ставил через pip).
    В последнюю очередь импорты модулей из твоего проекта.
    В каждой секции элементы можно упорядочить по алфавиту, если нет особых причин импортировать их в другом порядке.
    Ответ написан
    Комментировать
  • Что не так между кавычками: "sqlite3.OperationalError: near "̀": syntax error"? Учусь писать бота, по необходимости, но так ничего и не понял что там?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, если ты используешь синтаксис INSERT INTO table VALUES (...), то список значений должен в точности повторять список столбцов. У тебя порядок явно не совпадает. Используй синтаксис INSERT INTO table (столбец, столбец, ...) VALUES (значение, значение, ...), так проще контролировать правильность запроса.

    Во-вторых, никогда не формируй строку запроса с помощью форматирования строк! Это хороший способ заполучить SQL-инъекцию, Бобби Тейблз подтвердит. =) Используй плейсхолдеры (поищи строку "Never do this -- insecure!", и почитай рядом).
    Ответ написан
    3 комментария
  • Как сделать таймер в команде mute?

    Vindicar
    @Vindicar
    RTFM!
    Взять и сделать. В чём конкретно вопрос? Что именно не получается?
    Тупой лобовой вариант - использовать простую цепочку вызовов
    # выдать мьют
    await asyncio.sleep(время) # подождать
    # снять мьют
    в обработчике команды !mute. Но проблема в том, что если бот будет перезапущен, пока идёт ожидание, он забудет про этот таймер - и юзер останется замьюченным. Кроме того, проблематично будет управлять списком замьюченных.
    Вторая мысль - в обработчике !mute выдаём мьют, вычисляем время, когда его нужно снять, и записываем в БД пользователя, сервер, время снятия и причину.
    Затем раз в минуту проверяем эту БД на предмет наличия истёкших мьютов, извлекаем их и снимаем.
    Плюс - мьют переживёт перезапуск бота, и всегда можно посмотреть кто-когда-насколько-за что.
    Минус - так как проверяем раз в минуту, то сроки и остатки меньше минуты будут округлены вверх. Можно исправить, увеличив частоту проверки, но понапрасну долбать бота этой проверкой тоже не стоит.

    Сам мьют проще всего реализовать, создав соответствующую роль, и выдавать/снимать её юзеру.

    Как-то так. За конкретными ответами "какие методы вызвать" - в документацию. Если нужна помощь с конкретными ошибками - создавай новый вопрос, приводи код (отформатируй кнопкой </>!) и полный текст ошибки.
    Ответ написан
    Комментировать
  • Как исправить следующую ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Гуглинг нашел вот этот ответ на stackoverflow.
    Если я верно понял, там предлагается сделать так:
    from tqdm._tqdm_notebook import tqdm_notebook
    tqdm_notebook.pandas()

    И далее по тексту. Но гарантий дать не могу, сам с такой ошибкой не сталкивался.
    Ответ написан
    1 комментарий
  • Как проверить присутствие данного файла в данном каталоге с помощью os.listdir()?

    Vindicar
    @Vindicar
    RTFM!
    Что-то типа такого. Метод resolve() нужен, чтобы разобраться с элементами типа .. и символическими ссылками, и получить абсолютные пути.
    from pathlib import Path
    target_path = ... #определяешь целевой путь
    
    if Path(sys.argv[0]).parent.resolve() == Path(target_path).resolve():
        print('Тот же путь!') #оба пути указывают на один каталог
    Ответ написан
    Комментировать
  • Не могу спарсить страницу?

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

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

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону pyarmor, он это умеет (и, главное, умеет обфусцировать код, чтобы защиту было не так-то просто отломать). Обойти его можно, но уже не совсем тривиально.
    Ответ написан
  • Как проверить, выключил ли участник микрофон?

    Vindicar
    @Vindicar
    RTFM!
    Почитать документацию.
    class discord.VoiceState
    Represents a Discord user’s voice state.
    deaf
    bool – Indicates if the user is currently deafened by the guild.
    mute
    bool – Indicates if the user is currently muted by the guild.
    self_mute
    bool – Indicates if the user is currently muted by their own accord.
    self_deaf
    bool – Indicates if the user is currently deafened by their own accord.
    Ответ написан
    Комментировать
  • Как настроить расширение frame'ов?

    Vindicar
    @Vindicar
    RTFM!
    self.surf.grid_columnconfigure(0, weight=1)
    self.surf.grid_columnconfigure(1, weight=1)

    Обозначит, что при расширении сжатии оба столбца должны расширяться одинаково.
    Если веса сделать, скажем, 3 и 1, то столбец с весом три "отъест" 75% дополнительного пространства, а с весом 1 - 25%. Если вес столбца 0, он не меняет размер.

    Аналогично есть метод .grid_rowconfigure().
    Ответ написан
    3 комментария
  • Как разобрать запрос на несколько переменных в боте телеграм?

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

    Так что я бы сначала посмотрел argparse. Оно заточено на аргументы командной строки, но чат-боты недалеко от неё ушли.
    Ответ написан
    4 комментария
  • Как добавить айдишников в конфиг.py?

    Vindicar
    @Vindicar
    RTFM!
    > operator = "4609....71" and "109....307"
    Извините мой французский, но что это за фигня? Вы применяете логические операторы к строкам, неужели ничего неладного не заподозрили?
    Вам нужна коллекция idшников, и нужно проверять вхождение в эту коллекцию!
    Например, множество (так как я не думаю, что оператор должен входить в список дважды, верно?):
    operators = {"4609....71",  "109....307"}
    for op in operators: #перебираем элементы множества
        await bot.forward_message(op, message.from_user.id, message.message_id)

    Тогда добавить нового оператора будет легко и просто:
    operators.add("1234....890")
    При этом при попытке повторного добавления просто ничего не произойдёт.
    Аналогично можно удалить:
    operators.remove("1234....890")
    При попытке удаления отсутствующего оператора будет выброшено KeyError.
    Ну и если надо проверить, является ли id оператором:
    if "1234...890" in operators:
    Ответ написан
    Комментировать
  • Как изменить sys.path в venv?

    Vindicar
    @Vindicar
    RTFM!
    А что за модули?
    Если это pip-пакеты, их нужно установить в этот конкретный venv, используя местный pip.
    Если это твои собственные модули, которыми ты часто пользуешься - можешь попытаться создать свой пакет и установить его как любой другой. Пакет не требуется загружать pypi.org, pip вполне устанавливает пакеты из файла.
    Если же это локальные модули проекта, то тут надо смотреть структуру каталогов этого проекта.
    Ответ написан
  • Sqlite3.OperationalError: no such table: users?

    Vindicar
    @Vindicar
    RTFM!
    Засунь текст ошибки в гугл-транслейт, что ли...
    Он тебе английским по белому говорит, что таблица users не создана. Как mr_forlife объяснил, нужно создать таблицу через запрос вида CREATE TABLE. Ты создаёшь только login_id, но не users.
    Ответ написан
    2 комментария
  • Не открывается скомпилированный файл .ехе, что делать?

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

    Vindicar
    @Vindicar
    RTFM!
    Нет, нельзя. Нужно архитектуру бота менять, так ты результата не добьёшься.

    1. Поступающие запросы складываешь в очередь (а лучше в БД).
    2. Бот периодически проверяет наличие непроверенных запросов и выкидывает их менеджеру. Так как менеджер - существо неторопливое, это можно делать раз в пару минут или даже реже.
    3. По реакции от менеджера запрос помечается как проверенный (одобренный/отклонённый).
    4. Бот периодически проверяет, есть ли проверенные, но не обработанные запросы. Если есть, обрабатывает их, и помечает их как обработанные.
    5. Опционально: периодически запросы, отмеченные как обработанные, удаляются из БД.
    Ответ написан
    Комментировать
  • No such column: id почему выхдает ошибку в discord.py ,sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформляй код, нечитаемо же. Кнопка </>.

    Во-вторых, у тебя запрос на создание таблицы имеет вид CREATE TABLE IF NOT EXISTS - то есть если таблица уже существует, этот запрос молча ничего не сделает. Обычно так и надо - но проблема в том, что если таблица существует, но имеет другой, неправильный набор столбцов, этот запрос всё равно молча ничего не сделает! Он проверяет только существование таблицы, но не её структуру.

    Вот поэтому Hemul GM и просит тебя показать структуру таблицы, как она есть в базе данных. Это можно сделать парой способов, например так.
    Напиши отдельный простой скрипт на питоне, который подключается к твоей базе и выполняет следующий запрос:
    SELECT sql FROM sqlite_master WHERE name = 'users';

    Сравни набор столбцов в этом запросе со своим запросом. Если столбцы не совпадают, значит, имеет место та ситуация, о которой я писал выше. Тогда тебе придётся или удалить таблицу(а может и всю базу) а потом создать её заново, уже как надо... или выполнить запрос ALTER TABLE, чтобы изменить набор столбцов в таблице.
    Первое гораздо проще, если ты ещё только разрабатываешь бота, и в базе не хранится ценной информации.
    Ответ написан
    6 комментариев
  • Как решить ошибку TypeError: expected str, bytes or os.PathLike object, not list?

    Vindicar
    @Vindicar
    RTFM!
    os.walk(path)

    os.walk() принимает путь К ОДНОЙ директории, а ты пихаешь список
    Просто пройдись по path циклом, и каждый элемент уже обрабатывай.
    Ответ написан
    1 комментарий
  • Как подать на вход и получить с выхода нейросети массив на python,tensorflow?

    Vindicar
    @Vindicar
    RTFM!
    Смотря о каких массивах речь. Если размер массива известен и фиксирован, то тут читай любой туториал по тензорфлоу. Либо используй перцептрон, либо (если не покатит), пробуй более глубокую сеть.

    Если массив - это именно последовательность элементов переменной длины, то тебе нужны энкодеры или seq2seq сети.

    И опять же, в чём конкретно сложность? Код?
    Ответ написан
    Комментировать
  • Как изменить язык created_at.strftime?

    Vindicar
    @Vindicar
    RTFM!
    import locale
    locale.setlocale(0, "") #чтобы выбрать текущую локаль операционной системы
    # или 
    locale.setlocale(0, "ru-ru") #если нужна именно русская, даже если ОС не на русском.
    Ответ написан
    Комментировать