我在我的包裹中广泛使用twisted.internet.defer
,我遇到了一个问题,我花了2天后就无法解决这个问题。以下是我的问题场景。
# all imports done and correct
class infrastructure: # line 1
@inlineCallbacks
def dict_service(self):
client = MyClient()
services = yield client.listServices() # line 5
ret = (dict(service.name, [cont.container_id for cont in service.instances]) for service in dockerServices)
returnValue(ret) # line 7
我正在调用我的客户端,它返回我的服务列表。 listServices()
返回类型为twisted.internet.defer.ReturnValue
。
class myinterface:
# has infrastructure
def init:
data = dict(
container_services=self._infrastructure.dict_service(),
)
执行此操作时,我得到以下错误,我无法理解。有人可以帮忙吗。
raise TypeError(repr(o) + \" is not JSON serializable\")\nexceptions.TypeError: <DeferredWithContext at 0x4bfbb48 current result: <twisted.python.failure.Failure <type 'exceptions.NameError'>>> is not JSON serializable\n"
是否因为dict
包裹returnValue
而产生问题?
答案 0 :(得分:1)
使用returnValue
实例{/ 1}}时没有问题:
dict
您报告的错误:
$ python -m twisted.conch.stdio
>>> from __future__ import print_function
>>> from twisted.internet.defer import inlineCallbacks, returnValue
>>> @inlineCallbacks
... def f():
... d = yield {"foo": "bar"} # Yield *something* or it's not a generator
... returnValue(d)
...
>>> f().addCallback(print)
{'foo': 'bar'}
<Deferred at 0x7f84c51847a0 current result: None>
使您看起来好像有一些代码触发raise TypeError(repr(o) + \" is not JSON serializable\")\nexceptions.TypeError: <DeferredWithContext at 0x4bfbb48 current result: <twisted.python.failure.Failure <type 'exceptions.NameError'>>> is not JSON serializable\n"
。这似乎发生在Deferred回调中(或以其他方式进入Deferred)并被包裹在NameError
中:
Failure
离开:
<twisted.python.failure.Failure <type 'exceptions.NameError'>>
我不知道raise TypeError(repr(o) + \" is not JSON serializable\")\nexceptions.TypeError: <DeferredWithContext at 0x4bfbb48 current result: ...> is not JSON serializable\n"
是什么。我猜它是DeferredWithContext
的子类,有一些额外的行为。如果你可以链接到提供这个的库(这对我来说似乎是一个坏主意,但我想了解更多),那就太好了。
如果是这样,则错误是在讨论Deferred
实例,其结果为上述DeferredWithContext
:
Failure
离开:
<DeferredWithContext at 0x4bfbb48 current result: ...>
这似乎来自json模块,raise TypeError(repr(o) + \" is not JSON serializable\")\nexceptions.TypeError: ... is not JSON serializable\n"
或dump
函数。这声称传入了非JSON序列化的东西。dumps
几乎肯定不是JSON可序列化的,因此解释了这个问题。
这可能是因为:
DeferredWithContext
应改为:
json.dumps(function_that_returns_deferred())