<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>