Dans Python 3.6, je peux utiliser yield
dans une coroutine. Cependant je ne peux pas utiliser yield from
.
Voici mon code. Sur la ligne 3 j'attends une autre coroutine. À la ligne 4, j'essaie de yield from
un fichier. Pourquoi Python 3.6 ne me permet-il pas de faire cela?
async def read_file(self, filename):
with tempfile.NamedTemporaryFile(mode='r', delete=True, dir='/tmp', prefix='sftp') as tmp_file:
await self.copy_file(filename, tmp_file)
yield from open(tmp_file)
Voici l'exception Python 3.6 déclenche pour le code ci-dessus:
File "example.py", line 4
yield from open(tmp_file)
^
SyntaxError: 'yield from' inside async function
Selon PEP 525 , qui introduit des générateurs asynchrones dans Python 3.6:
Asynchrone
yield from
Bien qu'il soit théoriquement possible d'implémenter
yield from
support des générateurs asynchrones, cela nécessiterait une refonte sérieuse de l'implémentation des générateurs.
yield from
est également moins critique pour les générateurs asynchrones, car il n'est pas nécessaire de prévoir un mécanisme de mise en œuvre d'un autre protocole de coroutines par-dessus les coroutines. Et pour composer des générateurs asynchrones un simpleasync for
la boucle peut être utilisée:async def g1(): yield 1 yield 2 async def g2(): async for v in g1(): yield v
Comme vous pouvez le voir, la réponse se résume à "ce serait trop difficile à mettre en œuvre, et vous n'en avez pas besoin de toute façon".