Построить продиктовать для цикла без повторений - PullRequest
0 голосов
/ 22 июня 2019

Мой код в настоящее время очень повторяется с grouped_events.setdefault('VAR', []).append(event) и event_data_by_organizer[organizer.pk]['events_draft'] = grouped_events.get('VAR').Видите ли вы лучший способ написания этого?

В настоящее время моя лучшая идея - написать вышеупомянутую функцию, в которую я вставляю такие строки, как 'archived' и т. Д.

   # Events by status
    grouped_events = {}
    for event in events:
        if event.status == EventStatus.ARCHIVED:
            grouped_events.setdefault('archived', []).append(event)
        elif event.status == EventStatus.DRAFT:
            grouped_events.setdefault('draft', []).append(event)
        elif event.is_over:
            grouped_events.setdefault('past', []).append(event)
        else:
            grouped_events.setdefault('live', []).append(event)

    event_data_by_organizer[organizer.pk][
        'events_archived'
    ] = grouped_events.get('archived')
    event_data_by_organizer[organizer.pk]['events_draft'] = grouped_events.get(
        'draft'
    )
    event_data_by_organizer[organizer.pk]['events_past'] = grouped_events.get(
        'past'
    )
    event_data_by_organizer[organizer.pk]['events_live'] = grouped_events.get(
        'live'
    )

1 Ответ

1 голос
/ 22 июня 2019

Вы можете использовать defaultdict вместо ручного вызова setdefault. Вспомогательное сопоставление (EVENT_MAPPING) может использоваться для сокращения кода для назначения event_data_by_organizer.

Из-за условий, при которых вы группируете события, дальнейшее сокращение трудно group_events(events) (или, по крайней мере, я не вижу пути).

from collections import defaultdict


EVENT_MAPPING = {
    "archived": "events_archived",
    "draft": "events_draft",
    "past": "events_past",
    "live": "events_live",
}


def group_events(events):
    grouped_events = defaultdict(list)

    for event in events:
        if event.status == EventStatus.ARCHIVED:
            events = grouped_events["archived"]
        elif event.status == EventStatus.DRAFT:
            events = grouped_events["draft"]
        elif event.is_over:
            events = grouped_events["past"]
        else:
            events = grouped_events["live"]

        events.append(event)

    return grouped_events


def set_organizer_events(events_by_organizer, organizer_pk, grouped_events):
    for event, state in EVENT_MAPPING.items():
        events_by_organizer[organizer_pk][state] = grouped_events[event]


my_grouped_events = group_events(my_events)
set_organizer_events(my_organizers, 1, my_grouped_events)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...