У меня есть объект "элемент" (), полученный в результате вызова API (JSON) следующим образом:

{
"id": 1,
"type": 10,
"via": {
     "from":{
        "id": "511",
        "name": "a"
     },
     "to":{
        "id": "999",
        "name": "b"
     }
   }
}

Итак, когда я это сделаю

print(item.via.to['id']) 

Он работает правильно, но когда я пытаюсь сделать:

print(item.via.from['id']) 

Я получаю сообщение об ошибке SyntaxError: недопустимый синтаксис "от". Потому что это зарезервированное ключевое слово.

Как я могу получить доступ к этому значению? Я не могу изменить имя "от", потому что оно исходит из вызова API.

Спасибо.

1
Tonino Fernandez 27 Ноя 2021 в 15:56
Разве это не должно быть item.via.from?
 – 
rdas
27 Ноя 2021 в 15:58
Это JSON или класс?
 – 
gold_cy
27 Ноя 2021 в 15:59
3
getattr(item.via, 'from').id возможно, но вы действительно должны предоставить минимально воспроизводимый пример
 – 
juanpa.arrivillaga
27 Ноя 2021 в 15:59
Вы правы, я здесь неправильно написала, извините.
 – 
Tonino Fernandez
27 Ноя 2021 в 16:00
@ juanpa.arrivillaga Я получаю: AttributeError: объект 'via' не имеет атрибута 'from'
 – 
Tonino Fernandez
27 Ноя 2021 в 16:02

1 ответ

Лучший ответ

Просматривая код API, на который вы ссылаетесь, похоже, что это зарезервированные слова, по соглашению для их классов перед ним стоит префикс _ (здесь)

Так что попробуйте использовать item.via._from, _from - допустимый идентификатор.

Также может быть лучше вызвать to_dict или даже более низкий уровень __dict__ для объекта и получить к нему доступ по строке, но я думаю, что первый должен работать:


x = item.via._from.id


x = item.to_dict()["via"]["from"]["id"]

# or worst case…

x = item.via.__dict__["from"].id

2
tplusk 27 Ноя 2021 в 16:19
Ты мастер !!
 – 
Tonino Fernandez
27 Ноя 2021 в 16:17
1
Item.via._from не работал. Но item.via.from_ сработало :), также работала функция to_dict
 – 
Tonino Fernandez
27 Ноя 2021 в 16:19
1
Прохладный! Рад помочь
 – 
tplusk
27 Ноя 2021 в 16:20