代码之家  ›  专栏  ›  技术社区  ›  DonkeyOaty

Twisted-Python3 TypeError:\uu init\uuUU()缺少1个必需的位置参数:“factory”

  •  3
  • DonkeyOaty  · 技术社区  · 6 年前

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

    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'
    

    提前感谢您的帮助!

    1 回复  |  直到 6 年前
        1
  •  0
  •   daviewales    6 年前

    这可能与您的问题有关:

    在本节中,您可以调用 Screen() 无任何参数:

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

    但是,您之前定义 Screen 采取行动 factory 参数:

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