web-dev-qa-db-fra.com

Pourquoi ne puis-je pas «céder» à l'intérieur d'une fonction asynchrone?

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
19
Akilesh

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 simple async 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".

17
Zero Piraeus