[Tutor] Problem with calling class methods stored in a list

Tobias M. tm at tobix.eu
Sat Jan 12 19:28:24 CET 2013


Peter Otten wrote:
> You are right; the misunderstanding is that I wasn't advertising the above
> "fancy" solution (which is buggy, btw).
Yes, I wasn't sure about the irony in you last post ;)

Peter Otten wrote:
>
> I have now implemented what I had in mind with the protocol to function name
> mapping, and I think /that/ is reasonably complex. I'm using instance
> methods in the demo, but it should work with class methods as well.
>
> class Error(Exception):
>      def __init__(self, protocol):
>          Exception.__init__(self, self.template.format(protocol))
>
> class UnknownProtocolError(Error):
>      template = "Unknown protocol {}"
>
> class ProtocolNotSupportedError(Error):
>      template = "Protocol {} not supported"
>
> FOO = (42, 17)
> BAR = (1, 2)
> BAZ = (3, 4)
> HAM = (4, 5)
> SPAM = (5, 6)
>
> class HandlersBase(object):
>      protocol_to_methodname = {
>          FOO: "foo",
>          BAR: "bar",
>          BAZ: "baz",
>          HAM: "ham",
>          }
>      def get_handler(self, protocol):
>          try:
>              methodname = self.protocol_to_methodname[protocol]
>          except KeyError:
>              raise UnknownProtocolError(protocol)
>          
>          method = getattr(self, methodname, None)
>          if method is None:
>              raise ProtocolNotSupportedError(protocol)
>          return method
>
> class A(HandlersBase):
>      def foo(self): print "A.foo"
>      def bar(self): print "A.bar"
>      def baz(self): print "A.baz"
>      
> class B(A):
>      def bar(self): print "B.bar"
>      baz = None # hide parent implementation
>
> if __name__ == "__main__":
>
>      for Class in A, B:
>          inst = Class()
>          print "---", Class.__name__, "---"
>          for protocol in FOO, BAR, BAZ, SPAM:
>              try:
>                  inst.get_handler(protocol)()
>              except Error as err:
>                  print err
Thanks for the code! It's very similar to what I implemented but more 
flexible regarding inheritance.


More information about the Tutor mailing list