@Alex_888

Как прочитать dict?

raw.update присылает
{1448413438: pyrogram.raw.types.ChannelForbidden(id=1448413438, access_hash=8335995624985435932, title='N', broadcast=True, megagroup=False)}

как мне получить id?
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 2
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
У вас словарь из ключа и значения. В качестве значения у вас экземпляр класса pyrogram.raw.types.ChannelForbidden с определенными в круглых скобках параметрами. Среди этих параметров у вас есть id.
Но получить этот параметр в лоб нельзя. Он для этого не предназначен.

Вот если бы raw.update возвращал бы строку, её можно было бы распарсить. Но по вашему примеру он возвращает словарь с экземпляром класса в качестве значения…

В принципе, если бы мы точно знали бы, что ключ словаря всегда равен id, можно было бы как-то так:
data = {1448413438: dict(id=1448413438, access_hash=8335995624985435932, title='N', broadcast=True, megagroup=False)}
keys = [*data.keys()]
print(data[keys[0]])

Но мы не знаем точно, всегда ли id равно ключу…
Ответ написан
Комментировать
@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)
Хотя что с ними делать, если они совершенно произвольны, я не могу представить. Но вдруг зачем-то нужно (например, сохранять на будущее, чтобы потом извлекать конкретный ответ).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы