Depuis Python 2.5, yield <value>
est une expression, pas une déclaration. Voir PEP 342 .
Le code est hideusement et inutilement laid, mais il est légal. Son astuce centrale consiste à utiliser f((yield x))
à l'intérieur de l'expression du générateur. Voici un exemple plus simple de ce fonctionnement :
>>> def f(val):
... return "Hi"
>>> x = [1, 2, 3]
>>> list(f((yield a)) for a in x)
[1, 'Hi', 2, 'Hi', 3, 'Hi']
En fait, l'utilisation de yield
dans l'expression du générateur lui fait produire deux valeurs pour chaque valeur de l'itérable source. Au fur et à mesure que l'expression du générateur itère sur la liste de chaînes de caractères, à chaque itération, la fonction yield x
donne d'abord une chaîne de caractères à partir de la liste. L'expression cible du genexp est f((yield x))
Ainsi, pour chaque valeur de la liste, le "résultat" de l'expression du générateur est la valeur de f((yield x))
. Mais f
ignore simplement son argument et retourne toujours la chaîne d'option "-o"
. Ainsi, à chaque étape du générateur, celui-ci produit d'abord la chaîne clé-valeur (par exemple, "x=1"
), alors "-o"
. L'extérieur list(reversed(list(...)))
fait juste une liste à partir de ce générateur et l'inverse pour que le "-o"
viendront avant chaque option au lieu de venir après.
Cependant, il n'y a aucune raison de procéder de cette manière. Il existe un certain nombre d'alternatives beaucoup plus lisibles. La plus explicite est peut-être simplement :
kvs = [...] # same list comprehension can be used for this part
result = []
for keyval in kvs:
result.append("-o")
result.append(keyval)
return result
Même si vous aimez le code laconique et "intelligent", vous pouvez toujours faire simplement
return sum([["-o", keyval] for keyval in kvs], [])
En kvs
La compréhension de la liste elle-même est un mélange bizarre de tentative de lisibilité et d'illisibilité. Il est plus simplement écrit :
kvs = [str(optName) + separator + str(optValue) for optName, optValue in options.items()]
Vous devriez envisager d'organiser une "intervention" pour celui qui a mis cela dans votre codebase.