Pythonで引数として渡すクラスのコンストラクタを書き換える
Pythonでsimple-websocket-serverというWebSocketのライブラリを使ってServerがデータを受信したらそれを自分が指定したQueueに格納したいのですがうまくいきません。
このライブラリではWebSocket
クラスを継承してハンドラとなるクラスを作り、それをSimpleWebSocketServer
のコンストラクタのcls
引数として渡すようになっています。
自分が渡したQueueにデータを格納したいので下記のように関数f
にqueueを渡し、その返り値の関数がMyWebSocketのインスタンスをreturnするようにしたのですが、うまくいかず、localhost:4246
にアクセスしても接続が確立されません。
Windows10 1803
Python3.6.5
class MyWebSocket(WebSocket):
def __init__(self, server, sock, address, q): # queueを受け取る(q)
super().__init__(server, sock, address)
self.q = q
def handleMessage(self):
print(self.data)
self.q.put_nowait(self.data) #わたってきたデータをqueueに格納
def handleClose(self):
print("connection: closed " + self.address)
self.sendMessage("server exit")
sys.exit()
def f(l):
def websocketclasscaller(server, sock, address): # SimpleSSLWebSocketServerはclsの引数が増えていることを知らないので`websocketclasscallerで隠す`
return MyWebSocket(server, sock, address, l)
return websocketclasscaller
def main(q):
p = f(q)
server = SimpleSSLWebSocketServer("localhost", 4246, p, "../certs/server.crt", "../certs/server.key")
server.serveforever()
SimpleSSLWebSocketServerの継承元であるSimpleWebSocketServerが引数clsをインスタンス化しているところ:
def _constructWebSocket(self, sock, address):
return self.websocketclass(self, sock, address)