fangwenxue
V2EX  ›  问与答

Python async yield 问题

  •  
  •   fangwenxue · Dec 29, 2021 · 1627 views
    This topic created in 1617 days ago, the information mentioned may be changed or developed.
    import asyncio
    
    
    class A:
        data = [1, 2, 3]
    
        async def test(self):
            for i in self.data:
                yield i
    
    
    class B(A):
        flag = True
    
        async def test(self):
            if self.flag:
                # 怎么直接返回父类的 test 并打印 1 2 3
                yield super(B, self).test()
            else:
                pass
    
        async def run(self):
            async for i in self.test():
                # 打印不是 1 2 3 而是 async_generator
                print(i)
    
    
    asyncio.run(B().run())
    
    
    4 replies    2021-12-29 14:35:08 +08:00
    ipwx
        1
    ipwx  
       Dec 29, 2021
    yield from
    ipwx
        2
    ipwx  
       Dec 29, 2021
    好吧 async 不能 yield from

    老老实实 async for ... in super().... yield
    chashao
        3
    chashao  
       Dec 29, 2021
    这样不知道对不对。。
    class A:
    data = [1, 2, 3]

    async def test(self):
    for i in self.data:
    yield i


    class B(A):
    flag = True

    def test(self):
    if self.flag:
    # 怎么直接返回父类的 test 并打印 1 2 3
    return super(B, self).test()
    else:
    pass

    async def run(self):
    async for i in self.test():
    # 打印不是 1 2 3 而是 async_generator
    print(i)

    asyncio.run(B().run())
    shyrock
        4
    shyrock  
       Dec 29, 2021
    async for 的功能是迭代一个异步可迭代对象。
    你写 async for i in self.test():就是迭代 B.test()。B.test()返回的是父类的一个异步生成器。所以迭代结果就是打印这个异步生成器对象了。
    如果你要迭代 A.test()的内容,改成这样就可以:
    async for i in super(B, self).test():
    print(i)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1229 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 17:36 · PVG 01:36 · LAX 10:36 · JFK 13:36
    ♥ Do have faith in what you're doing.