首页 > 解决方案 > 不使用数据类调用超类的 __init__

问题描述

我正在通过继承asyncio.Future一些自定义属性来创建一个作业类,并期望作业实例的功能类似于原始的 Future。

当我job.set_result在协程中调用时,它会引发 a Future object is not initialized error,然后我尝试通过调用来初始化未来,asyncio.ensure_future并出现相同的错误。

我尝试了更多,发现未来通常是由创建的loop.create_future(),但是,没有选项可以创建我的自定义未来。

下面是一个示例,如何初始化我的自定义未来?

import asyncio
from dataclasses import dataclass

@dataclass
class Job(asyncio.Future):
    job_task: Callable
    real_future: asyncio.Future = None
    something: str = None

    def schedule(self):
        async def run():
            res = await self.job_task()
            self.set_result(res) # raise error, future not initialized
            return res
        self.real_future = asyncio.ensure_future(run())

async def main():
    async def task():
        await asyncio.sleep(1)
        return 1
    job = Job(task)
    job.schedule()
    await job

asyncio.run(main())

标签: pythonpython-3.xpython-dataclasses

解决方案


问题是它Future不是数据类,而是你的Job类继承自它并使用@dataclass装饰器。这会导致调用Future.__init__失败,从而无法初始化未来对象。

要解决这个问题,首先不要使用@dataclass装饰器。相反,编写一个显式__init__设置必要的属性,并调用super().__init__()Future正确初始化。


推荐阅读