Получение TypeError с Python Tubes и Twisted модулем - PullRequest
0 голосов
/ 10 апреля 2020

В настоящее время я следую документации для Python труб , и по большей части все шло хорошо. Проблема в том, что после того, как я внедрил класс Reverser в свой код, ошибка TypeError продолжала появляться, когда я пытался подключиться через Te lnet.

Вот мой код:

#!/etc/python2.7
from tubes.protocol import flowFountFromEndpoint
from tubes.listening import Listener

from twisted.internet.endpoints import serverFromString
from twisted.internet.defer import Deferred, inlineCallbacks
from twisted.python import log

from tubes.framing import bytesToLines, linesToBytes
from tubes.tube import series



class Reverser(object):
    def received(self, item):
        yield b"".join(reversed(item))

def reverseFlow(flow):
    lineReverser = series(bytesToLines(), Reverser(), linesToBytes())
    flow.fount.flowTo(lineReverser).flowTo(flow.drain)

@inlineCallbacks
def main(reactor, listenOn="stdio:"):
    listener = Listener(reverseFlow)
    endpoint = serverFromString(reactor, listenOn)
    flowFount = yield flowFountFromEndpoint(endpoint)
    flowFount.flowTo(listener)
    yield Deferred()

if __name__ == '__main__':
    from twisted.internet.task import react
    react(main, ["tcp:8000"])

I Я использую эту команду в другом терминале (Linux, Ubuntu 19.10) для подключения к серверу, показанному выше:

telnet 127.0.0.1 8000

Вторая попытка подключиться, сервер показывает это сообщение:

Unhandled Error
Traceback (most recent call last):
  File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/python/log.py", line 86, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/python/context.py", line 122, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/python/context.py", line 85, in callWithContext
    return func(*args,**kw)
  File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
    why = selectable.doRead()
--- <exception caught here> ---
  File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/internet/tcp.py", line 1435, in doRead
    protocol.makeConnection(transport)
  File "/home/edgecase/.local/lib/python2.7/site-packages/twisted/internet/protocol.py", line 514, in makeConnection
    self.connectionMade()
  File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/protocol.py", line 239, in connectionMade
    self._flow(self._fount, self._drain)
  File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/protocol.py", line 411, in aFlowFunction
    listening.impl.drain.receive(Flow(fount, drain))
  File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/listening.py", line 93, in receive
    item.drain))
  File "/home/edgecase/Programs/Tubes/test3.py", line 19, in reverseFlow
    lineReverser = series(bytesToLines(), Reverser(), linesToBytes())
  File "/home/edgecase/.local/lib/python2.7/site-packages/tubes/tube.py", line 235, in series
    drains = [IDrain(tube) for tube in tubes]
exceptions.TypeError: ('Could not adapt', <__main__.Reverser object at 0x7faf92066a90>, <InterfaceClass tubes.itube.IDrain>)

В идеале сервер должен принимать любые отправленные ему данные, сторнировать эти данные и отправлять их обратно - просто как простой пример обработки данных с использованием модуля Tubes , И по жизни я не могу понять, почему это не работает. Я пытался смотреть онлайн, но я не могу найти решение. Что именно вызывает это?

1 Ответ

1 голос
/ 10 апреля 2020

В рендере документации есть ошибка. Если вы прочитаете список источников , то увидите, что Reverser должен быть украшен tube:

from tubes.tube import tube, series

@tube
class Reverser(object):
    def received(self, item):
        yield b"".join(reversed(item))

Я ожидаю, что этот декоратор сделает необходимые аннотации, чтобы Reverser экземпляров будут адаптированы к IDrain.

...