• Как исправить RuntimeWarning: coroutine was never awaited?

    @trankov
    Проблем тут две.

    Во-первых, недостаточно просто написать async, чтобы код начал выполняться асинхронно. Это всего лишь помечает, что данная функция это корутина для запуска в асинхронном контексте. Здесь нужен не цикл из 5 итераций, а 5 асинхронных функций, которые будут запущены через asyncio, и отработают не по очереди, а конкурентно.

    Во-вторых (что вызывает сообщение об ошибке) — clicked.connect принимает в качестве аргумента Callable, а не Coroutine. Для того, чтобы вызвать асинхронную функцию, вызывающий код должен использовать await. В .connect никакого await не прописано. Соответственно, и ошибка возникает: was never awaited. То есть в качестве возвращаемого значения происходит попытка вернуть объявленную корутину вне асинхронного контекста.

    Что тут можно сделать. Во-первых, использовать нативную для QT асинхронность. Во-вторых, сделать def working обычной функцией, которая вызывает цепочку связанных корутин через asyncio. Но это будет отдельный от QT цикл событий, то есть внутри себя он будет асинхронным, но QT-приложение до своего полного выполнения заблокирует всё равно.

    Так что пользуйтесь асинхронным инструментарием, предлагаемым QT из коробки.
    Ответ написан
    Комментировать
  • Как пройти двухфакторную аутентификацию на сайте с помощью Python?

    @trankov
    Двухфакторная идентификация для того и придумана, чтобы её нельзя было заскриптовать.
    Ответ написан
    Комментировать
  • Как прочитать dict?

    @trankov
    Смотрите. Вы получаете словарь ключ: значение. Вы никогда не знаете, какой именно будет ключ. Но вы знаете, что в словаре всегда одна строка, и что значение тоже содержит словарь, в котором ключи уже известны:

    response = {
        1448413438: pyrogram.raw.types.ChannelForbidden(
            id=1448413438,
            access_hash=8335995624985435932,
            title='N',
            broadcast=True,
            megagroup=False
        )
    }

    Значит, вам просто надо обратиться к первому по счёту значению. Для этого у dict есть два метода: keys() и values(). Они выдадут вам ключи и значения по отдельности. Внимание, результат будет not subscriptable, то есть, чтобы к обращаться к значениям, вам нужно преобразовать результат в list или tuple. Кстати, если вы преобразуете в них сам словарь, они отдадут вам именно список/кортеж самих ключей, то есть писать response.keys() необязательно, можно написать просто response.

    Вариантов, таким образом, может быть несколько. Например, можно обратиться к значению напрямую:

    tuple(response.values())[0]['id']

    Либо пойти через ключ (для краткости не буду объявлять переменную, но суть понятна, надеюсь):

    response[tuple(response)[0]]['id']

    Конечно, если в возвращаемом словаре на первом уровне пар ключ/значение будет больше одной, задача слегка усложнится. Здесь вам как раз поможет извлечение пришедших ключей.

    reps_keys = tuple(response)
    Хотя что с ними делать, если они совершенно произвольны, я не могу представить. Но вдруг зачем-то нужно (например, сохранять на будущее, чтобы потом извлекать конкретный ответ).
    Ответ написан
    Комментировать
  • Обязательно ли использовать класс в Python?

    @trankov
    Если не надо хранить какие-то постоянные данные, классы не нужны.
    Вообще, в Python в стандартной библиотеке уже написано большинство нужных в обычной жизни классов. Просто используйте их.
    Ответ написан
    Комментировать
  • Как превратить QuerySet в JSON?

    @trankov
    1. import json
    2. Получить словарь из queryset
    3. json.dumps(словарь)
    Ответ написан
    Комментировать