Poiché Python 2.5, yield <value>
è un'espressione, non un'istruzione. Vedi PEP 342.
Il codice è orribilmente e inutilmente brutto, ma è legale. Il suo trucco principale è usare f((yield x))
all'interno dell'espressione del generatore. Ecco un esempio più semplice di come funziona:
>>> def f(val):
... return "Hi"
>>> x = [1, 2, 3]
>>> list(f((yield a)) for a in x)
[1, 'Hi', 2, 'Hi', 3, 'Hi']
In sostanza, utilizzando yield
nell'espressione generatore induce a produrre due valori per ogni valore nella sorgente iterabile. Poiché l'espressione del generatore esegue iterazioni sull'elenco di stringhe, a ogni iterazione, lo yield x
innanzitutto fornisce una stringa dall'elenco. L'espressione target del genexp è f((yield x))
, quindi per ogni valore nell'elenco, il "risultato" dell'espressione del generatore è il valore di f((yield x))
. Ma f
ignora semplicemente il suo argomento e restituisce sempre la stringa di opzioni "-o"
. Quindi, in ogni passaggio attraverso il generatore, produce prima la stringa valore-chiave (ad es., "x=1"
), quindi "-o"
. L'esterno list(reversed(list(...)))
crea solo un elenco da questo generatore e quindi lo inverte in modo tale che lo "-o"
s venga prima di ogni opzione anziché dopo.
Tuttavia, non c'è motivo di farlo in questo modo. Esistono numerose alternative molto più leggibili. Forse il più esplicito è semplicemente:
kvs = [...] # same list comprehension can be used for this part
result = []
for keyval in kvs:
result.append("-o")
result.append(keyval)
return result
Anche se ti piace terso, codice "intelligente", si potrebbe ancora basta fare
return sum([["-o", keyval] for keyval in kvs], [])
Il kvs
di lista è di per sé un bizzarro mix di tentato leggibilità e illeggibilità. E 'scritto più semplicemente:
kvs = [str(optName) + separator + str(optValue) for optName, optValue in options.items()]
Si dovrebbe prendere in considerazione l'organizzazione di un "intervento" per chi mettere questo nel tuo codebase.
Dang. Parla di codice illeggibile. – BenDundee
la parte più divertente è la 'lista (invertita (lista (' parte per ottenere le opzioni '-o' a destra, anche se – ch3ka
Anche tutti i lambda potevano essere stati semplicemente' ((lambda _: '-o') ((resa x)) per x in kvs) ' –