Python Twisted推迟returnValue与dict不兼容

时间:2017-02-10 10:42:55

标签: python python-2.7 twisted twisted.internet

我在我的包裹中广泛使用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而产生问题?

1 个答案:

答案 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())