• Определитель матрицы 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.
    Ответ написан
    Комментировать
  • Как решить проблему с экземпляром класса?

    Vindicar
    @Vindicar
    RTFM!
    3Create, вот и ответ - не нужно вызывать экземплярные методы на классе.
    Поясню. Если у тебя есть такой класс:
    class A:
      #это экземплярный метод - нет декоратора @classmethod или @staticmethod
      def test(self, x, y): 
        print(x+y)


    То при обычном вызове в духе
    a = A() #создаём экземпляр класса
    a.test(1, 2) #вызываем метод экземпляра

    ссылка на объект a автоматически помещается в self, тогда 1 попадёт в x, а 2 в y.
    Если же вызывать A.test(1,2), то поскольку экземпляра нет, его нужно явно указывать. Тогда в self попадёт 1, в x попадёт 2, а для y значения не найдётся, что приведёт к ошибке.
    Можно вызвать это так: A.test(a, 1, 2), но это по сути то же самое, что a.test(1,2).
    Ответ написан
    Комментировать
  • Как добавлять данные в список при использовании multiprocessing?

    Vindicar
    @Vindicar
    RTFM!
    В multiprocessing есть класс Queue, используйте его.
    Ответ написан
    Комментировать
  • Как с помощью discord бота сохранить файлы от пользователя на свой компьютер?

    Vindicar
    @Vindicar
    RTFM!
    discord.py
    Событие on_message для обработки входящих и исходящих сообщений (пример).
    Свойство attachments объекта Message, чтобы проверить прикреплённые файлы.
    Если же сброшенное изображение - это ссылка, то тут нужно регулярками шерстить текст сообщения.
    Ответ написан
    Комментировать
  • Как создать объект с запретом на изменение чего-либо на глобальном уровне?

    Vindicar
    @Vindicar
    RTFM!
    Если вы не доверяете импортируемому коду, вы можете отчасти изолировать его в другом процессе с помощью модуля multiprocessing - в том числе по отношению к globals. По-крайней мере, разрушительные действия этого кода будут ограничены. Но он всё ещё может наворотить дел, например, в файловой системе. Кое-что можно будет поправить в нашей функции-обёртке для импорта модуля, но это непростая задача, и реализуется по-разному в зависимости от ОС, под которой работает интерпретатор.
    Например,
    from multiprocessing import Process
    
    def run_module(modulename: str): #обёртка для импорта модуля.
        try:
            #модуль может содержать код, который выполнится прямо в этот момент
            import modulename 
            #либо мы можем потребовать, чтобы в целевом модуле была отдельная функция-точка входа, например run()
            modulename.run() 
        except Exception as err:
            raise #можем добавить какую-то общую реакцию на ошибки модуля
    
    # описываем новый процесс
    p = Process(target=run_module, args=('module_name', ))
    p.start() #API процессов имитирует API потоков.

    Также модуль предоставляет механизмы для общения между процессами.
    Ответ написан
    5 комментариев
  • Как прочитать файлы с кириллицей/разными символами?

    Vindicar
    @Vindicar
    RTFM!
    1. Вот что ты ожидал получить, открыв docx просто через open()? Разумеется, ты получаешь содержимое файла... содержимое, а не текст. Потому что docx - это на самом деле zip архив с пачкой xml файлов внутри. Из них можно выколупать текст самостоятельно, но это муторно.

    2. Это уже ближе, но серьёзно, включи мозги - у тебя предполагаемое имя файла содержит то, что выглядит как текст документа. Т.е. судя по всему, функция docx2txt.process() возвращает текст документа как есть, строкой. А ты действуешь как будто она пишет его в файл и возвращает имя этого файла. Наверняка в документации к этому модулю её поведение описывается.
    Ответ написан
    Комментировать
  • Как создать интерфейс на питоне в браузере?

    Vindicar
    @Vindicar
    RTFM!
    Тебе, по-сути, нужно разработать локально работающий сайт.
    Погугли в сторону django, например.
    Хотя для очень простых вещей можно обойтись и встроенным HTTP сервером питона, с ним не очень удобно работать.
    Ответ написан
  • Куда всунуть аргумент self?

    Vindicar
    @Vindicar
    RTFM!
    Для начала, что такое main() - метод или свободная функция? Если метод, метод вызывается как self.main(). Это азы синтаксиса Питона, их нужно знать прежде чем бросаться воевать с Ткинтером.
    Во-вторых, зачем лямбда? Если метод не требует параметров, то можно указать просто self.main без скобок. Лямбда нужна, если параметры, передаваемые кнопкой, не совпадают с параметрами, требуемыми методом.
    Ответ написан
    6 комментариев
  • Как в discord.py сделать чтобы создатель сервера мог указывать роли для команд?

    Vindicar
    @Vindicar
    RTFM!
    Нужна база данных, так как эту информацию нужно будет сохранять при перезапуске бота.
    Если задача стоит как "укажите, какая роль будет модератором", то тогда в базе должна быть таблица, где сопоставляется ID сервера и ID роли.
    Тогда алгоритм задания роли будет такой:
    1. Проверяем, что отправивший команду является владельцем сервера.
    2. Определяем ID сервера.
    3. Вытаскиваем из параметров команды название роли.
    4. Перебираем роли на сервере, ищем роль с таким названием, запоминаем её ID.
    5. Помещаем пару сервер-роль в таблицу БД. Для обычной базы данных на основе SQL (вроде строенной питоновской sqlite) хорошо использовать запрос вида INSERT ... ON CONFLICT UPDATE ... - это позволит не париться, была ли уже задана роль модератора для этого сервера.

    Алгоритм проверки роли будет такой:
    1. Получаем ID сервера, на котором была отправлена команда.
    2. Получаем ID роли отправителя команды.
    3. Проверяем, есть ли в таблице строка с такой парой сервер-роль.
    4. Если есть, разрешаем выполнить команду.

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

    Vindicar
    @Vindicar
    RTFM!
    1. OpenCV умеет работать с четырьмя источниками видео: видеофайл, набор файлов-кадров, подключённая камера, видеопоток по сети. На втором скриншоте ошибка про CAP_IMAGES намекает, что OpenCV пытается интепретировать URL во втором режиме вместо четвёртого. Стоит указать дополнительный параметр конструктора VideoCapture, задающий режим открытия источника видео.

    2. API OpenCV довольно непоследователен в своей сигнализации ошибок, и выбрасывает исключения только если скормить функции некорректные данные. Ситуации типа некорректного формата изображения сигнализируются возвращаемыми значениями. В вашем случае всё, что остаётся - подождать пару секунд, периодически опрашивая isOpened(). Если она не вернула истину по окончанию интервала, считаем попытку неудавшейся. Альтернатива - пытаться перехватывать сообщенеи в консоль, оно, похоже, выводится стандартным модулем logging. Но это тот ещё хак.

    3. Точный URL зависит от вида и конфигурации ПО, которое используется для web-стриминга. Заранее не узнаешь. Максимум - можно попытаться нагуглить URL по умолчанию для наиболее популярных версий такого ПО и пробовать их по очереди.
    Ответ написан
  • Почему Kivy выдает ошибку при запуске программы?

    Vindicar
    @Vindicar
    RTFM!
    Гугл нашел issue на гитхабе kivy. Последний пост от февраля этого года указывает на необходимость добавить пару каталогов в переменную окружения PATH, примерно так.
    # you must add to the path the location of your SDL2 binaries
    os.environ['PATH'] += ';' + os.path.expandvars('%AppData%\\Python\\share\\glew\\bin')
    os.environ['PATH'] += ';' + os.path.expandvars('%AppData%\\Python\\share\\sdl2\\bin')


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