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])