<div dir="ltr">Is there is a better way to create parameterized classes than defining and returning a class in a closure? I ask because I want to create arbitrary BaseRequestHandler subclasses that delegate line handling to a given line handler, as in this example:<div>
<br></div><div><div><div><div><div> from SocketServer import *</div><div><br></div><div> class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass</div><div><br></div><div> def LineRequestHandler(handler):</div>
<div> class __LineRequestHandler(BaseRequestHandler):</div><div> def handle(self):</div><div> for line in self.lines():</div><div> handler.handle(line)</div><div><br></div><div> def lines(self):</div>
<div> line = self.line()</div><div> while line:</div><div> yield line</div><div> line = self.line()</div><div> </div><div> def line(self):</div><div> parts = []</div>
<div> while not parts or parts[-1] and not parts[-1][-1] == "\n":</div><div> parts.append(self.request.recv(2**10))</div><div> if parts:</div><div> return ''.join(parts)[0:-1]</div>
<div> </div><div> return __LineRequestHandler</div><div><br></div><div> class SomeLineHandler:</div><div> def handle(self, line):</div><div> print "I got a line: %s" % line</div>
<div><br></div><div> if __name__ == '__main__':</div><div> s = ThreadingTCPServer(("", 2005), LineRequestHandler(SomeLineHandler()))</div><div> s.serve_forever()</div><div><br></div></div>
<div>I really wish I could create a class whose instances were classes that subclassed BaseRequestHandler. Is this possible, or is there a better way than my approach here? Or am I crazy?</div><div><br></div><div>And I may be dense, so if there is an easier way to stream sockets as line streams, please let me know. I honestly don't think it should be this difficult to implement a socket handler this simple.</div>
</div></div></div></div>