Вполне возможно, что это вообще не проблема, а мое собственное неправильное понимание шаблона интерфейса.
Рассмотрим следующее 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
?