如何将参数传递给reconectingclientfactory

时间:2018-08-12 14:02:12

标签: python twisted autobahn

将参数传递给reconectingclientfactory时遇到一些问题:

class MyClientFactory(WebSocketClientFactory, ReconnectingClientFactory):

protocol = MyClientProtocol
maxDelay=90
maxRetries=10000

def __init__(ver,cfg,*args,**kwargs):
    self.sysVer=ver
    self.sysCfg=cfg 
    super().__init__(*args,**kwargs)



def clientConnectionFailed(self, connector, reason):
    print("Client connection failed {0} to: {1} .. retrying ..".format(reason,connector))
    self.retry(connector)

def clientConnectionLost(self, connector, reason):
    print("Client connection lost {0} to {1} .. retrying ..".format(reason,connector))
    self.retry(connector)

当我打电话时:

factory = MyClientFactory('ws:/mywswebserver/websocket/', ver=sys_ver, cfg=sys_cfg,protocols={"wsprotocol"})

出现类似以下错误:

TypeError: __init__() got multiple values for argument 'cfg'

有人可以告诉我我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

使用或不使用super是方法的(通常未记录)公共接口的一部分。另外,super确实不允许在层次结构中的任何位置更改方法的签名。实际上,它不是将自定义配置传递到层次结构中特定类的有用工具。

说:

class MyClientFactory(WebSocketClientFactory, ReconnectingClientFactory):
    def __init__(ver,cfg,*args,**kwargs):

您在此签名中忘记了self。因此在:

factory = MyClientFactory('ws:/mywswebserver/websocket/', ver=sys_ver, cfg=sys_cfg,protocols={"wsprotocol"})

您正在传递'ws:/mywswebserver/websocket/'作为cfg参数。然后,您还传递了sys_cfg作为另一个值。因此,您有一个关于为cfg传递多个值的例外。

通过将self添加到您的__init__的签名中,可以解决您的立即例外情况。但是,您可能随后会遇到其他问题。