Mes meilleures tentatives ont échoué:Comment transformer ceci en un générateur de ligne unique?
for s in self.services:
for m in s.messages: yield m
Mes meilleures tentatives ont échoué:Comment transformer ceci en un générateur de ligne unique?
for s in self.services:
for m in s.messages: yield m
itertools.chain.from_iterable(s.messages for s in self.services)
Ceci est mon préféré. Flat est mieux que niché, en particulier dans one-liners. – twneale
Oui c'est parfait - je voulais utiliser itertools.chain() car c'était parce que je faisais plusieurs rendements, donc j'ai juste eu plus pour l'import. – Tony
@Tony: Est-ce que vous réalisez que ce sera parfaitement incompréhensible pour les gens qui vous demandent de maintenir votre code? Savez-vous que les gens vous détesteront d'avoir mis cela dans le code qu'ils doivent maintenir? –
(m for s in self.services for m in s.messages)
... comme contre-intuitif que cela puisse paraître.
Ceci est basé sur un exemple trouvé dans PEP 289 qui spécifie (propose?) Des expressions de générateur en premier lieu. Le PEP n'explique pas vraiment très bien comment cela fonctionne dans les cas difficiles comme celui-ci; Peut-être que cela dépend de la familiarité avec ce comportement de la compréhension de la liste? –
Merci, ça marche, mais j'aime la méthode itertools car il est beaucoup plus facile d'écrire et de revenir plus tard pour comprendre ce qui se passe rapidement. – Tony
J'aime aussi la méthode itertools. ;) –
@Oscar Python ne vous permet pas de mettre deux suites-introducteurs (faute d'un meilleur terme) sur la même ligne comme ça. –