Задать вопрос
  • Как считать время (кулдаун) для команды?

    Vindicar
    @Vindicar
    RTFM!
    Неправильная архитектура.
    Тебе незачем отсчитывать время постоянно - просто запомни, когда команда была отправлена данным пользователем, и при следующем запуске этой команды проверь запомненное предыдущее время отправки и сверь его с текущим. Если разница больше кулдауна, можно выполнять команду снова.
    Ответ написан
  • Почему UDP-клиенту на VirtualBox-Ubuntu не приходят датаграммы с UDP-сервера-Windows?

    Vindicar
    @Vindicar
    RTFM!
    while ((sel = select(s, &rfd, NULL, NULL, &time_val)) <= 0) {
                            res = sendto(s, dns_datagram, data_curlen, flags, (struct sockaddr*) &addr,
                                    sizeof(struct sockaddr_in));
                            if (res < 0) {
                                    printf("res = %d\nError. Server offline?\n", res);
                                    printf("sel = %d\n", sel); // out 0
                            }
                            FD_ZERO(&rfd);
                            FD_SET(s, &rfd);
                    }

    Первое, почему условие <=0 а не ==0? Возврат -1 означает ошибку, и не должен проглатываться. Таймаут - это именно 0.
    И я вижу косяк в первом аргументе у select.
    nfds This argument should be set to the highest-numbered file
    descriptor in any of the three sets, plus 1. The
    indicated file descriptors in each set are checked, up to
    this limit (but see BUGS).

    Т.е. тебе нужно s+1 туда передать.

    И да, MSDN пишет:
    nfds Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.

    Вот почему под виндой работает.
    Ответ написан
    Комментировать
  • Как узнать какие папки находится в папке?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как работает запись переменных в память в Python?

    Vindicar
    @Vindicar
    RTFM!
    Если по аналогии, то любые переменные - это не более чем указатели на реальные объекты.
    И этими реальными объектами рулит garbage collector питона.
    Разница в том, что некоторые объекты изменяемые (точнее, объекты-ссылки), а некоторые нет (объекты-значения).
    Объекты-значения копируются при попытке модификации:
    a = 1
    b = a
    b += 2
    print(a, b) #1 3

    Объекты ссылки нет:
    a = [1]
    b = a
    b += [2]
    print(a, b) #[1, 2] [1, 2]
    Ответ написан
    Комментировать
  • Как правильно запустить Discord-бота в потоке?

    Vindicar
    @Vindicar
    RTFM!
    Я не в курсе как работает threadSignal.connect(), но я знаю, что bot.run() не вернёт управление, пока бот не завершит работу.
    Т.е. из функции BOT_RUN поток управления не вернётся ещё очень долго.
    Возможно, стоит перепланировать, какой поток что делает? Выделить отдельный поток под bot.run()?
    Ответ написан
    Комментировать
  • TypeError: solve() takes 0 positional arguments but 3 were given как исправить???

    Vindicar
    @Vindicar
    RTFM!
    Подумать головой. Какой именно solve() ты пытаешься вызвать?
    sols=solve([fx,fy],x,y)
    Из какого модуля? Потому что у тебя есть функция
    def solve():
    И программа уже видит только твою функцию.

    Поэтому
    1. переименуй свою функцию
    2. старайся не делать from xxx import *. Сплошная морока с таким подходом, как видишь. Лучше явно вызвать sympy.solve(). То же касается остальных модулей.
    Ответ написан
    2 комментария
  • Проблема с произведением музыки в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну подумай головой.
    > 'NoneType' object has no attribute 'play'
    > voice_channel.play(
    Значит, voice_channel - None.
    Смотрим откуда он взялся, читаем доки по Guild.voice_client:
    "voice_client - Returns the VoiceProtocol associated with this guild, if any.
    Type: Optional[VoiceProtocol]"
    Т.е. он вполне может быть None, и это надо проверять перед использованием.

    А вот более интересный вопрос, почему он None.
    Ты выше обращаешься к channel = ctx.author.voice.channel - а ведь не только voice может быть None, но и channel в нём. voice проверяешь, channel нет. А чуть ниже у тебя удивительная конструкция:
    try:
          await channel.connect()
        except:
          pass

    Дай угадаю, channel.connect() кидал 'NoneType' object has no attribute 'connect'?
    Никогда на надо глотать исключения таким образом - всё без разбора и без реакции.
    channel.connect() кидает ровно три возможных исключения, и их нужно обрабатывать по-нормальному!
    asyncio.TimeoutError – серверу икнулось, мы ничего сделать не можем, только попросить пользователя повторить по-позже.
    ClientException – мы уже к войс-чату подключены, нужно либо переключаться, либо просить подождать, пока закончим с первым запросом.
    OpusNotLoaded – библиотеку opus не загрузил, она нужна для работы с голосом.
    Ещё раз, except: pass - это очень, очень хороший способ выстрелить себе в ногу.

    И самое-то смешное, что в документации на connect() написано что оно возвращает готовый к работе voice_channel. Тогда вроде как не нужно было ctx.guild.voice_client трогать, connect() отдаст нужный объект.
    Ответ написан
    Комментировать
  • Как изменять переменную через время в боте VK?

    Vindicar
    @Vindicar
    RTFM!
    Храни в базе пары "ID пользователя" - "время предыдущей отправки команды", при отправке команды вытаскивать по ID отправившего прошлое время и смотреть сколько с тех пор времени прошло.

    Детали зависят от инструментария, но даже на этом форуме этот самый вопрос неделю или две назад задавали.
    Ответ написан
    Комментировать
  • Почему не видно изменения переменной из процесса Python?

    Vindicar
    @Vindicar
    RTFM!
    И впрямь не надо использовать глобальные переменные. Они свои в каждом процессе.
    Изучите доки по multiprocessing, в частности класс Queue для двусторонней передачи данных.
    Ответ написан
    Комментировать
  • Как сделать так, что бы программа искала ключевые слова в предложениях?

    Vindicar
    @Vindicar
    RTFM!
    Регулярные выражения (модуль re), частности маркер \b - граница слова.
    Регулярка "ворот" найдёт и "ворот", и "поворот", и "воротник"
    Регулярка "\bворот\b" найдёт только "ворот", но не "поворот" / "воротник".

    А вот если вам нужны словоформы ("летел/летаю/лечу/летим"), то задача усложняется.
    Ответ написан
    Комментировать
  • Определитель матрицы nxn Python?

    Vindicar
    @Vindicar
    RTFM!
    Где-то в расчётах получилось NaN - Not A Number.
    Могли поделить на ноль, больше я не вижу операций, которые могли NaN сгенерировать.
    Проверяйте значения матрицы по шагам, что тут ещё скажешь.
    Ответ написан
    Комментировать
  • Как прибавить +1 к значению в sqlite?

    Vindicar
    @Vindicar
    RTFM!
    > Сама ошибка - star = cursor.fetchone()[0]
    > TypeError: 'NoneType' object is not subscriptable

    not subscriptable означает что ты пытаешься взять индекс у объекта, который это не поддерживает. В твоем случае объект типа NoneType - т.е. None.
    Иными словами, cursor.fetchone() вернул None, и конечно у None нельзя взять индекс.
    Почему fetchone() вернул None? Потому что запрос SELECT не нашёл ни одной строки с подходящим значением photo!

    Как это решить?
    Вставить в таблицу строку с photo, а если не получится (так как такое photo уже есть), то обновить. Есть два способа.
    1. Кодом. Проверить, что вернул fetchone(). Если None, то делаем INSERT. Если не None, то UPDATE.
    2. Средствами БД, что обычно называется UPDATE/INSERT, или коротко UPSERT. Для sqlite это потребует примерно такого запроса:
    INSERT INTO stars (photo, star) VALUES (ид фото, 1) ON CONFLICT (photo) DO UPDATE SET star = star + 1

    Требование: столбец photo должен быть первичным ключом или хотя бы иметь уникальный индекс, иначе запрос просто будет добавлять дубликат строки.

    ВАЖНО
    f'SELECT star FROM stars WHERE photo = "{photo}"' - никогда так не делайте! Особенно если входные данные получены от пользователя. Это хороший способ заполучить SQL-инъекцию.
    Используйте placeholders, по порядку:
    cursor.execute('SELECT star FROM stars WHERE photo = ?', (photo, ) )
    или по именам
    cursor.execute('SELECT star FROM stars WHERE photo = :photo', {'photo' : photo} )
    И удобнее и безопаснее.
    Ответ написан
    7 комментариев
  • Как получить https редирект ссылку в запросе get?

    Vindicar
    @Vindicar
    RTFM!
    > переходя на которую происходит 5-ти секундная проверка
    Это означает, что редирект выполняется средствами JS, а не через коды ответа HTTP 3XX.
    requests умеет обрабатывать только последний вариант, так как она не эмулирует браузер целиком.
    Теоретически правильную ссылку можно выцарапать из содержимого скачанной страницы, но на практике не факт - скорее всего, страницу с проверкой ввели как раз для защиты от скриптов типа твоего.
    Можешь поиграться с пакетом selenium, он позволяет притворяться полноценным браузером - вдруг получится.
    Ответ написан
    2 комментария
  • Json представление класса при передаче в метод Python?

    Vindicar
    @Vindicar
    RTFM!
    Гораздо лучше явно добавить метод to_json() в ваш класс, и явно вызывать его.
    Это будет гораздо проще в реализации и понимании.

    __str__() предназначен для человекочитаемого представления, а __repr__(), в идеале, для строкового представления, которое можно eval'нуть обратно в объект.
    Под сериализацию в json они подходят плохо.
    Ответ написан
    Комментировать
  • Какие параметры есть у файла python кроме -i?

    Vindicar
    @Vindicar
    RTFM!
    python /? под Windows
    python --help под Linux
    И читайте внимательно.
    А вообще, вопрос для гугла.
    Ответ написан
    1 комментарий
  • Как написать input для дискорд бота?

    Vindicar
    @Vindicar
    RTFM!
    Простой вариант - параметры команды. Иными словами, задаёшь все исходные данные для выполнения команды в одном начальном сообщении.
    Например,
    > Ты: !скажи 3 Привет
    < Бот: Привет
    < Бот: Привет
    < Бот: Привет
    Если ты используешь discord.py, то она предоставляет очень удобный механизм для таких вещей. Он подробно описан в документации.

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

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

    Но если позарез нужно, то есть способы.

    1. Динамическая проверка класса при выполнении
    isinstance(x, list) проверит, что объект является списком или наследуется от списка.
    isinstance(x, (list, tuple)) сделает то же для пары возможных классов
    Я бы не рекомендовал такой подход, так как проверка выполняется каждый раз при выполнении, даже если её результат заведомо известен. Кроме того, нередки ситуации, когда метод обозначен как "ожидает список", но при этом всё что делает со списком - перебирает элементы. Т.е. на деле любая коллекция сработала бы.

    2. Статическая проверка (погугли про python type hints)
    Переписываешь заголовок метода так:
    from typing import Optional
    class Math:
        def __init__(self, first: Int, second: Optional[Int] = None):

    Если потом передать в конструктор неверные типы, сам интерпретатор питона проигнорирует это и выполнит скрипт как обычно. Но есть отдельная утилита mypy, которая статически (без запуска скрипта) анализирует скрипт и проверяет, что ты передаёшь в тот или иной метод, и выдаст ошибку если тип неверный. Таким образом можно статически убедиться в корректности скрипта, не теряя производительность во время выполнения.

    3. Протоколы
    Это развитие предыдущего подхода, подобие интерфейсов в других ООП языках. Они также используются совместно с mypy, интерпретатор питона их игнорирует.
    Ответ написан
    Комментировать
  • При запуске скрипта из notepad++ не находится файл лежащий в той же папке, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Почитай про понятие "текущий каталог". Если путь к файлу относительный, то он отсчитывается относительно текущего каталога.
    Я подозреваю, что текущий каталог при работе NPP - это каталог где лежит сам NPP, и он его не меняет при запуске (потому что не знает, нужно ли).
    Попробуй поменять команду на запуск на что-то типа
    cmd /K cd "$(CURRENT_DIRECTORY)" && python "$(FULL_CURRENT_PATH)"

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

    Vindicar
    @Vindicar
    RTFM!
    Тебе придётся реализовать state machine (оно же конечный автомат) самому. Это не так уж сложно, погугли.
    Если коротко: есть список состояний (шагов, на которых может находиться пользователь), есть список переходов между состояниями. Каждому переходу сопоставлена кнопка.
    Когда пользователь входит в состояние, выведи кнопки, соответствующие всем переходам из этого состояния. Когда пользователь нажимает кнопку, перейди в состояние, помеченное как конец соответствующего перехода.
    Текущее состояние нужно хранить для каждого пользователя отдельно. По-хорошему это надо делать в БД (чтобы состояния пережили перезапуск бота), но обучения ради можно и в памяти, просто в словаре вида user_id:state_id.
    Ответ написан
    Комментировать
  • Как лаконично переписать код на python?

    Vindicar
    @Vindicar
    RTFM!
    Смотря какая задача и какие ограничения. Если ты просто ищешь строки вида
    NS1:id="цифры"
    то тут и регулярки подойдут. Например, re.compile('NS1:id="(\d+)"').
    А вот если тебе нужно потом работать со структурой xml документа, то нужно использовать lxml.ElementTree.
    Ответ написан
    Комментировать