【问题标题】:Twisted - Python3 TypeError: __init__() missing 1 required positional argument: 'factory'Twisted - Python3 TypeError:__init__()缺少1个必需的位置参数:'工厂'
【发布时间】:2018-08-16 05:35:12
【问题描述】:

我正在编写一些 python 软件来轮询 modbus 连接并将数据存储在 SQL 数据库中。为了查看机器是否作为快速测试工作,我正在制作一个简单的控制台样式“HMI”,您可以通过 telnet 进入。这是有问题的代码和错误。

from twisted.internet.protocol import Protocol, Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet import task
from twisted.internet import protocol

#from screenhelp import ScreenHelp ** Not relevant to error


class Screen(Protocol):

    def __init__(self, factory):
        self.factory = factory
        self.connection = False
        self.loop = task.LoopingCall(screenRefresh)
        self.loopDeferred = None
        self.stack = []
        self.cs = ScreenHelp()

    def connectionMade(self):
        self.loopDeferred = self.loop.start(self,5)

    def connectionLost(self, reason):
        self.loop.stop(self)

    def dataReceived(self, data):
        self.stack.append(data)

    def screenRefresh(self):

        #self.transport.write(self.cs.clr()) ** Not relevent - issues clear screen command.
        for x in self.stack:
            self.transport.write(x)

class ScreenFactory(Factory):
    def buildProtocol(self, addr):
        return Screen()


def main():
    endpoint1 = TCP4ServerEndpoint(reactor, 64000)
    endpoint1.listen(ScreenFactory)
    reactor.listenTCP(5000, fact)
    reactor.run()


if __name__ == "__main__":
     main()

错误是:

File "/usr/lib/python3/dist-packages/twisted/internet/protocol.py", line 135, in buildProtocol
    p = self.protocol()
TypeError: __init__() missing 1 required positional argument: 'factory'

提前感谢您的帮助!

【问题讨论】:

  • 这是整个错误吗?
  • 该错误消息似乎与您发布的代码无关。 p = self.protocol() 行没有出现。但是,在您实际发布的代码中,您会收到类似的错误,因为您在实例化 Screen 类时没有传递 factory 参数。

标签: python python-3.x twisted twisted.internet


【解决方案1】:

这可能与您的问题有关:

在本节中,您调用 Screen() 时不带任何参数:

class ScreenFactory(Factory):
    def buildProtocol(self, addr):
        return Screen()

但是,之前您将 Screen 定义为采用 factory 参数:

class Screen(Protocol):
    def __init__(self, factory):
        ...

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2021-06-05
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多