Python json.dump并发.futures.Future()?

Python json.dump并发.futures.Future()?,python,json,python-3.x,future,Python,Json,Python 3.x,Future,假设我有一些未来: f = concurrent.futures.Future() data = [f] 最后,我想将这些内容转储到JSON中,我保证,到那时,未来已经解决: f.set_result(42) json.dumps(data) 如何将两者结合起来?重写JSONECODER类并在将来的实例上调用o.result()是一种方法 class CustomJSONEncoder(json.JSONEncoder): def default(self, o, *args, **

假设我有一些未来:

f = concurrent.futures.Future()
data = [f]
最后,我想将这些内容转储到JSON中,我保证,到那时,未来已经解决:

f.set_result(42)
json.dumps(data)

如何将两者结合起来?

重写JSONECODER类并在将来的实例上调用
o.result()
是一种方法

class CustomJSONEncoder(json.JSONEncoder):
    def default(self, o, *args, **kwargs):
        if isinstance(o, concurrent.futures.Future):
            return o.result()
        return super(CustomJSONEncoder, self).default(o, *args, **kwargs)

json.dumps(data, cls=CustomJSONEncoder)
要使其在没有自定义JSONEncoder的情况下工作,您可以自己迭代数据结构,调用
o.result()

或就地修改
数据

for i, o in enumerate(data):
    if isinstance(o, concurrent.futures.Future):
        data[i] = o.result()

我有一个hack覆盖了
jsonecoder
类,但是可能有更好的解决方案吗?很好,但是假设调用站点有数据模型知识。我希望有一些通用的东西。创建一个支持JSON的Future子类?可能只需要重写str来调用
self.result()
?我认为您正在对
returno.result
中的结果表示进行假设——这不也需要通过
super().default()管道传输吗?事实上,也许最好递归调用
return self.default(o.result)
以防
result
是一个容器,其中包含另一个已解决的未来?您只需调用
super().default()
来引发
TypeError
:如果
o.result()
是可迭代的,并返回它,它仍然应该被正确地序列化。我检查了Python源代码,以确保
default()
返回的任何内容都经过常规的序列化过程。
for i, o in enumerate(data):
    if isinstance(o, concurrent.futures.Future):
        data[i] = o.result()
json.dumps([d.result() for d in data])