Il titolo parla praticamente da solo, ma fornirò l'attuale decisione che sto affrontando.
Sto migrando il codice Python verso l'uso di generatori. Il codice attuale ha il seguente aspetto:
...
l = returns_a_list(args)
log.debug('examining {} entries', len(l))
for e in l:
do_stuff(e)
...
Al di fuori del log di debug, l
si adatta molto bene al caso d'uso di un generatore e la sua lunghezza non è necessaria da nessun'altra parte. Tuttavia, a causa del registro di debug, l'utilizzo di un generatore sarebbe simile a questo:
...
log.debug('examining {} entries', sum(1 for _ in returns_a_generator(args))
for e in returns_a_generator(args):
do_stuff(e)
...
Questo è meno leggibile e chiama il generatore due volte. Tuttavia, il codice di produzione è semplice. Un'altra opzione potrebbe essere:
...
count = 0
for e in returns_a_generator(args):
do_stuff(e)
count += 1
log.debug('examining {} entries', count)
...
Questo non chiama il generatore due volte, il che non è un grosso problema dato che non ci interessa davvero le prestazioni in modalità di debug. A mio avviso, sembra un po 'più semplice in termini di conteggio degli elementi rispetto a sum(1 for _ in generator)
, che non trasmette le intenzioni in modo chiaro (tuttavia, il precedente messaggio di debug dovrebbe suggerire cosa sta facendo quel frammento). Tuttavia non sono ancora sicuro che lo spostamento del log sia accettabile (cosa succede se do_stuff
fallisce? E se per qualche motivo il generatore restituisce la strada a molti valori? Mi piacerebbe avere quella linea di debug prima che il programma si blocchi o inizi a calcolare fino a quando la morte del calore dell'universo.). Inoltre, il conteggio viene eseguito anche senza registro di debug.
Quindi, qual è la tua opinione su questo problema generale? Cosa penseresti quando inciampi su una di quelle tre opzioni? Dopo averli capiti, ti interesserebbe che il registro di debug fosse contorto e file un problema / patch o penseresti "Ah, capito, è ragionevole così?"
EDIT: questa è la community dei programmatori. Non sono così interessato a soluzioni concrete a questo particolare problema, ma più a opinioni sulla prima, più ampia domanda (a meno che ovviamente non ci sia una buona argomentazione sul fatto che una tale scelta non dovrebbe mai accadere).