如何在构造函数或类主体中使用 await
定义类?
例如我想要的:
import asyncio
# some code
class Foo(object):
async def __init__(self, settings):
self.settings = settings
self.pool = await create_pool(dsn)
foo = Foo(settings)
# it raises:
# TypeError: __init__() should return None, not 'coroutine'
或带有类 body 属性的示例:
class Foo(object):
self.pool = await create_pool(dsn) # Sure it raises syntax Error
def __init__(self, settings):
self.settings = settings
foo = Foo(settings)
我的解决方案(但我希望看到更优雅的方式)
class Foo(object):
def __init__(self, settings):
self.settings = settings
async def init(self):
self.pool = await create_pool(dsn)
foo = Foo(settings)
await foo.init()
原文由 uralbash 发布,翻译遵循 CC BY-SA 4.0 许可协议
大多数魔术方法并非设计用于
async def
/await
通常,您应该只使用await
内部的专用魔术方法__aiter__
,__anext__
,__aenter__
, and__aexit__
.在其他魔术方法中使用它要么根本不起作用,就像__init__
的情况一样(除非您使用此处其他答案中描述的一些技巧),否则将迫使您始终使用触发魔术的任何东西异步上下文中的方法调用。现有
asyncio
库倾向于通过以下两种方式之一处理此问题:首先,我已经看到使用的工厂模式(asyncio-redis
,例如):其他库使用创建对象的顶级协程函数,而不是工厂方法:
create_pool
来自aiopg
的函数,你想在__init__
中调用 --- 实际上正在使用这个确切的模式。这至少解决了
__init__
问题。我还没有看到在野外进行异步调用的类变量,我记得,所以我不知道是否出现了任何完善的模式。