python - 不使用数据类调用超类的 __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())
解决方案
问题是它Future
不是数据类,而是你的Job
类继承自它并使用@dataclass
装饰器。这会导致调用Future.__init__
失败,从而无法初始化未来对象。
要解决这个问题,首先不要使用@dataclass
装饰器。相反,编写一个显式__init__
设置必要的属性,并调用super().__init__()
以Future
正确初始化。
推荐阅读
- firebase - 当存储在 Firestore 文档属性中的日期到达时如何触发云功能
- javascript - 我想在播放 YouTube 时停止其他视频
- python - 向熊猫数据框添加行索引
- c++ - 使用 MinGW 在 Windows 上的命令行编译 C++ 文件
- javascript - 如何将 Python 连接到 Node.js?
- html - 如何在html中使用响应行为制作不同的部分
- java - 如何在我突然点击隐藏通知的Android Studio中启用String.xml中的状态栏
- python - 使用django rest框架的api设计理念
- select - 在 vue 上的选择中单击选项时如何获得价值?
- php - 从多个表中选择多行并使用 php while 循环打印所有行