@Worgen

Как сократить код python?

Добрый день, не подскажите, как можно сократить код следующий код
test=newMessage.get('messages')
test=test.get('items')
test=test[0]
test=test.get('peer_id')


То что изначально находилось в newMessage
{'messages': {'count': 1, 'items': [{'peer_id': 111111, 'is_hidden': False, 'from_id': 111111, 'fwd_messages': [], 'out': 0, 'conversation_message_id': 1131, 'random_id': 0, 'date': 1537747480,
'text': '123', 'id': 1111, 'important': False, 'attachments': []}]}, 'new_pts': 111111, 'conversations': [{'out_read': 6160108, 'last_message_id': 66011108, 'in_read': 0, 'can_write': {'allowed': Tr
ue}, 'peer': {'type': 'user', 'id': 1111, 'local_id': 11111}, 'unread_count': 2}], 'profiles': [{'id': 11111, 'first_name': 'Мария', 'last_name': 'Старая'}], 'history': [[4, 6160108, 17,
312312]]}
  • Вопрос задан
  • 593 просмотра
Решения вопроса 1
@AlexandrBirukov
можно вот так:
def ch_payload(payload):
    result = {}
    for key, value in payload.items():
        if isinstance(value, list):
            if value:
                value = value[0]
        result[key] = value
        if isinstance(value, dict):
            result[key] = ch_payload(value)
    return result


def get_value(payload, item, fallback=None):
    """
    Получение вложенных данных

    d = {'a': {'b': {'c': 1}}}
    get_value(d, 'a.b.c')
    """

    serialize_dict = ch_payload(payload)

    def getitem(serialize_dict, name):
        try:
            return serialize_dict[name]
        except (KeyError, TypeError):
            return fallback

    return reduce(getitem, item.split('.'), serialize_dict)


и теперь для извлечения данных из json портянки можно делать следующее:
test = get_value(newMessage, "messages.items.peer_id")
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@smer44
test= newMessage.get('messages',default).('items')[0].('peer_id')

default = {'items': ['peer_id' : -42] }
или сделай данные попроще если можешь
Ответ написан
@Teslaman
test = newMessage["messages"]["items"][0]["peer_id"]


На самом деле, это не лучший вариант работы с вк апи. Гораздо удобней взять готовую библиотеку, которая возьмет на себя работу по сериализации json в удобные питоновские объекты. Вам нужно будет думать только о бизнес-логике приложения.
Ответ написан
@lega
try:
  test = newMessage["messages"]["items"][0]["peer_id"]
except KeyError:
  test = None
Ответ написан
Ваш ответ на вопрос

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

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