Controllo loop out factored in Python

1

Ho un ciclo for in python come questo:

for item in items:
    onwards = make_flow_decision(item)
    if onwards == 'break':
        break
    elif onwards == 'continue':
        continue
    elif onwards == 'carry_on':
        process_the_item(item)

Quindi l'idea è che il controllo del flusso per il ciclo sia scomposto perché è davvero complesso.

C'è un modo migliore per farlo, piuttosto che passare le stringhe e verificare le stringhe speciali come "continua", "interrompi" e "carry_on"?

In generale alla ricerca di idee che lo rendano un po 'più elegante.

    
posta mlissner 08.08.2015 - 18:34
fonte

2 risposte

5

Quello che potresti fare è eliminare il filtro e romperlo in un generatore, che può essere davvero utile se tale logica viene utilizzata più volte, con un'elaborazione diversa nel mezzo.

def relevant_items(items):
    for item in items:
        # logic to continue or break/return goes here
        yield item

def process_many_items(items):
    for item in relevant_items(items):
        process_item(item)

Questo tuttavia aggiunge un ulteriore livello di riferimento indiretto, che probabilmente vale solo se il metodo relevant_items ha senso al di fuori di process_many_items.

    
risposta data 09.08.2015 - 09:10
fonte
2

Puoi utilizzare tipi enumerati anziché stringhe e mantenere la tua implementazione.

Oppure, se non ti dispiace usare le eccezioni, puoi scrivere:

try:
    for item in items:
        if shall_process(item):
            process_the_item(item)
except StopIteration:
    pass

Qui, shall_process restituisce un valore booleano e può generare un'eccezione per uscire dall'iterazione.

    
risposta data 08.08.2015 - 21:19
fonte

Leggi altre domande sui tag