最神奇的方法不旨在与工作
async def/
await-在一般情况下,你应该只使用
await专用异步魔术方法里面-
,
__aiter__,
__anext__,
__aenter__和
__aexit__。在其他魔术方法中使用它或者根本无法正常工作
__init__(除非您使用此处其他答案中描述的一些技巧),否则将迫使您始终在异步上下文中使用任何触发魔术方法调用的方法。
现有的
asyncio库通常以以下两种方式之一来处理此问题:首先,我已经看到了使用的工厂模式(
asyncio-redis例如):
import asynciodsn = "..."class Foo(object): @classmethod async def create(cls, settings): self = Foo() self.settings = settings self.pool = await create_pool(dsn) return selfasync def main(settings): settings = "..." foo = await Foo.create(settings)
其他库使用创建对象的顶级协程函数,而不是工厂方法:
import asynciodsn = "..."async def create_foo(settings): foo = Foo(settings) await foo._init() return fooclass Foo(object): def __init__(self, settings): self.settings = settings async def _init(self): self.pool = await create_pool(dsn)async def main(): settings = "..." foo = await create_foo(settings)
您
create_pool要从
aiopg中调用的函数
__init__实际上正在使用此确切模式。
这至少解决了这个
__init__问题。我还没有看到可以在野外进行异步调用的类变量,所以我不知道会出现任何完善的模式。



