BaseRequestHandler 傳參問題
最近在寫Cooolis-ms 的時候遇到一個坑,學藝不精靠搜尋,最終解決了。
問題主要是不知道如何把ArgumentParser
處理的引數傳遞到繼承了BaseRequestHandler
的class
中。
通常情況下,建立一個TCP的socketserver
程式碼如下:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while True: try: self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) except ConnectionResetError as e: print("err",e) break if __name__ == "__main__": HOST,PORT = "localhost",9999 server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) server.serve_forever()
假若我想對MyTCPHandler
進行一些修飾,新增一些成員屬性,那就需要覆蓋__init__
函式,很多資料告訴我呼叫super
可以解決,但是BaseRequestHandler
是有引數的,這些引數必須由ThreadingTCPServer
進行傳遞。
因此,通過stackoverflow
上的一個大神
解決了問題:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def __init__(self,request, client_address, server,name): self.name = name def handle(self): while True: try: self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) except ConnectionResetError as e: print("err",e) break @classmethod def Creator(cls, *args, **kwargs): def _HandlerCreator(request, client_address, server): cls(request, client_address, server, *args, **kwargs) return _HandlerCreator if __name__ == "__main__": HOST,PORT = "localhost",9999 name = 'handle' server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler.Creator(name)) server.serve_forever()
呼叫Creator
就可以傳遞多餘的引數。
這個問題解決了,程式碼都在Cooolis-ms 裡體現。