gpt4 book ai didi

python - 不使用数据类调用父类(super class)的 __init__

转载 作者:行者123 更新时间:2023-12-02 02:18:21 25 4
gpt4 key购买 nike

我正在通过从 asyncio.Future 继承一些自定义属性来制作一个作业类,并期望作业实例像原始 Future 一样运行。

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

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

下面是一个例子,我怎样才能让我的自定义 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())

最佳答案

你需要自己调用父类(super class)的构造函数,这是数据类的__init__做不到的because of reasons .但是你也不应该尝试自己重新实现 __init__,因为它 is not exactly intuitive你可能会搞砸。

正确的做法(假设您想继续使用 @dataclass 装饰器)是利用数据类提供的 __post_init__ 钩子(Hook):

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

def __post_init__(self)
super().__init__()

def schedule(self):
async def run():
res = await self.job_task()
self.set_result(res) # works now
return res
self.real_future = asyncio.ensure_future(run())

关于python - 不使用数据类调用父类(super class)的 __init__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66827839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com