Seit Python 2.5 ist yield <value>
ein Ausdruck, keine Anweisung. Siehe PEP 342.
Der Code ist scheußlich und unnötig hässlich, aber es ist legal. Sein zentraler Trick ist die Verwendung von f((yield x))
innerhalb des Generatorausdrucks. Hier ist ein einfacheres Beispiel dafür, wie dies funktioniert:
>>> def f(val):
... return "Hi"
>>> x = [1, 2, 3]
>>> list(f((yield a)) for a in x)
[1, 'Hi', 2, 'Hi', 3, 'Hi']
Grundsätzlich mit yield
in dem Generator Ausdruck bewirkt, dass es zwei Werte für jeden Wert in der iterable Quelle erzeugen. Wenn der Generatorausdruck die Liste der Strings iteriert, gibt der yield x
bei jeder Iteration zuerst eine Zeichenfolge aus der Liste aus. Der Zielausdruck des Gensxp ist f((yield x))
, so dass für jeden Wert in der Liste das "Ergebnis" des Generatorausdrucks der Wert f((yield x))
ist. Aber f
ignoriert nur sein Argument und gibt immer die Optionszeichenfolge zurück. Bei jedem Schritt durch den Generator gibt es also zuerst die Schlüsselwertfolge (z. B. "x=1"
) und dann "-o"
aus. Die äußere list(reversed(list(...)))
macht nur eine Liste von diesem Generator und kehrt dann um, so dass die "-o"
s vor jeder Option statt nach kommen wird.
Es gibt jedoch keinen Grund, dies auf diese Weise zu tun. Es gibt eine Reihe viel besser lesbarer Alternativen. Vielleicht ist die deutlichste ist einfach:
kvs = [...] # same list comprehension can be used for this part
result = []
for keyval in kvs:
result.append("-o")
result.append(keyval)
return result
Auch wenn Sie kurz und bündig mögen, „clever“ Code, könnte man immer noch nur tun
return sum([["-o", keyval] for keyval in kvs], [])
Die kvs
Liste Verständnis selbst eine bizarre Mischung aus versucht, die Lesbarkeit ist und Unlesbarkeit. Es ist einfacher geschrieben:
kvs = [str(optName) + separator + str(optValue) for optName, optValue in options.items()]
Sie berücksichtigen sollen, eine „Intervention“ für die Anordnung wer auch immer diese in deiner Code-Basis.
Dang. Sprechen Sie über nicht lesbaren Code. – BenDundee
der lustigste Teil ist die 'Liste (umgekehrt (Liste (' Teil, um die '-o' Schalter rechts, obwohl – ch3ka
Auch alle Lambdas hätte nur sein können' ((Lambda _: '-o') ((Ausbeute x)) für x in kvs) ' –