这可能根本不是问题,而是我对底层接口模式的误解。
请考虑以下tube
:
@tube
class Capitalizer:
def received(self, value):
yield value.upper()
...然后以这种方式打开流程:
@inlineCallbacks
def main(reactor, listenOn="unix:path=trying-tubes"):
endpoint = clientFromString(reactor, listenOn)
ipc_flow = yield flowFromEndpoint(endpoint)
c = Capitalizer()
ipc_flow.fount.flowTo(c)
yield Deferred()
我得到:
builtins.AttributeError: 'Capitalizer' object has no attribute 'flowStopped'
好,所以看来我没有正确实现tube
接口。
如果我将其用作系列:
@inlineCallbacks
def main(reactor, listenOn="unix:path=trying-tubes"):
endpoint = clientFromString(reactor, listenOn)
ipc_flow = yield flowFromEndpoint(endpoint)
c = Capitalizer()
s = series(c)
ipc_flow.fount.flowTo(s)
yield Deferred()
...这很好。
因此,在series()
中查看时,我发现它在我的电子管上调用了IDrain
,似乎为它配备了排水管和其他必要的接口。
如果我自己尝试将其传递给IDrain
,则会得到:
builtins.TypeError: ('Could not adapt', <__main__.Capitalizer object at 0x7fda958b8b70>, <InterfaceClass tubes.itube.IDrain>)
这似乎是因为series
中的上下文管理器显示为:
with _registryActive(_tubeRegistry):
...
...在上下文中提供适当的工厂(即_tube2drain
)。
因此,如果我想只流入(流出)单个_tube2drain
,我是否应该给自己打电话tube
的某个变体?