Рефакторинг вложенные циклы for в Python


Я написал этот код, где в entity в feed.entityесли что entity есть поле с именем trip_update и он имеет соответствующий route_id тогда я должен идти через каждый trip_update.stop_time_update для того, чтобы убедиться в правильной метра транзитных (через stop_id сравнение) выбран. Тогда я вычислить некоторые данные, затем перебрать каждый trip в metraTripIds. Затем запустите базовую, если заявление, чтобы убедиться, что правильное положение возвращаются (который не является большим делом). Я просто чувствую, что имея 3 для отчетности в друг друга может быть переработан, чтобы быть выполнена быстрее. Я просто не понимаю, как в этой ситуации, хотелось бы услышать, что думают остальные!

for entity in feed.entity:
        if (entity.HasField('trip_update')) and (str(entity.trip_update.trip.route_id) == metraRouteId):
            for stoptime in entity.trip_update.stop_time_update:
                if (str(stoptime.stop_id) == metraStopId):
                    delayedTime = int((int(stoptime.arrival.time) - currentTime) / 60)
                    tripID = str(entity.trip_update.trip.trip_id).split('_')[1][2:]
                    for metraTrip in metraTripIds:
                        if (entity.trip_update.trip.trip_id == metraTrip["trip_id"]):
                            if (metraTrip["trip_headsign"] == metraTripHeadsignInbound):
                                metraLocation = metraInboundView
                            else:
                                metraLocation = metraOutboundView
                    predictionArray.append({'time': delayedTime, 'location': metraLocation, 'transitNumber': tripID, 'key': _ignoreThis})

    return predictionArray


301
-6
задан 11 апреля 2018 в 09:04 Источник Поделиться
Комментарии
1 ответ

Некоторые варианты:


  1. А что с помощью

    for foo in bar:
    if something:
    process foo

    вы можете перевернуть условие вокруг и досрочного прекращения:

    for foo in bar:
    if not something:
    continue
    process foo

    это уменьшает уровень вложенности и количество петель + количество условных, просто количество петель. Я считаю, что это хоть и спорно,. Некоторые разработчики не любят досрочного расторжения в целом, и это вовсе склоняются к карго-культ поведения - отступ, само по себе не делает код объективно более сложными, и досрочном совсем объективно добавить немного сложности в виде continue.


  2. Блок логически связанных строк в функции. Часто содержимое if блок принадлежим друг другу, так что конвертировать

    for cell in table:
    if something:
    preprocess row
    for cell in row:
    if something:
    process cell

    для

    for cell in table:
    if something:
    process_row(row)

    def process_row(row):
    preprocess row
    for cell in row:
    if something:
    process_cell(cell)

    def process_cell(cell):
    […]


  3. Я подозреваю, что есть ошибка в этом коде. metraLocation только устанавливается (или изменяется) состояниеentity.trip_update.trip.trip_id == metraTrip["trip_id"] держит. Если это условие не выполняется для первого пункта, то я считаю, что сценарий приведет к краху. Если это не первый пункт, но не по одной из последующих пунктов, ТО predictionArray запись будет получить значение из предыдущей итерации.

2
ответ дан 11 апреля 2018 в 09:04 Источник Поделиться