2017-11-19 48 views
7

W Pythonie 3.6, jestem w stanie użyć yield wewnątrz coroutine. Jednak nie mogę używać yield from.Dlaczego nie mogę "zrezygnować z" wewnątrz funkcji asynchronicznej?

Poniżej znajduje się mój kod. Na linii 3 czekam na kolejnego coroutine'a. W linii 4 próbuję pobrać plik yield from. Dlaczego Python 3.6 nie pozwala mi tego zrobić?

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) 

Oto pythonowy wyjątek 3,6 podnosi dla powyższego kodu:

File "example.py", line 4 
    yield from open(tmp_file) 
    ^
SyntaxError: 'yield from' inside async function 
+0

Czy to prawda, że ​​dekorator @ asyncio.coroutine może być użyty do włączenia "zysku z" w funkcji asynchronicznej? Z dokumentacji asyncio: "@ asyncio.coroutine¶ Dekorator do oznaczania coroutines na podstawie generatora, który umożliwia generatorowi wykorzystanie wydajności do wywoływania asynchronicznych defoutrów, a także umożliwia generowanie wywołania przez asynchroniczne defuty, na przykład za pomocą czekania wyrażenie." Nie jestem pewien, czy to działałoby z kodem, który napisałeś powyżej ... – Jasha

+0

Zobacz także https://stackoverflow.com/questions/39637675/what-is-the-difference-between-types-coroutine-and-asyncio -kontynent dekorator – Jasha

Odpowiedz

10

Według PEP 525, który wprowadza generatorów asynchronicznych Python 3.6:

asynchroniczny yield from

Podczas gdy ja Teoretycznie możliwe jest implementowanie generatorów asynchronicznych yield from dla , wymagałoby to poważnego przeprojektowania implementacji generatorów .

yield from jest również mniej krytyczne dla generatorów asynchronicznych, ponieważ nie ma potrzeby zapewnić mechanizm wdrażania inny protokół współprogram na szczycie współprogram. I komponować generatory prosty async for pętli można wykorzystać asynchroniczny:

async def g1(): 
    yield 1 
    yield 2 

async def g2(): 
    async for v in g1(): 
     yield v 

Jak widać, odpowiedź sprowadza się do „byłoby zbyt trudne do wykonania, i nie trzeba go tak czy owak ".

Powiązane problemy