Frank Millman wrote:
"MRAB" <pyt...@mrabarnett.plus.com> wrote in message news:mailman.444.1251290454.2854.python-l...@python.org...
An alternative is:

class MyClass(object):
...     def on_message_received(self, msg):
...         try:
...             getattr(self, "method_%d" % msg)()
...         except AttributeError:
...             raise Exception("Unknown message")
...     def method_0(self):
...         print 'in method_0'
...     def method_1(self):
...         print 'in method_1'
...
my_obj = MyClass()
my_obj.on_message_received(0)
in method_0
my_obj.on_message_received(1)
in method_1
my_obj.on_message_received(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in on_message_received
Exception: Unknown message

I like the idea. Unfortunately my real-world situation is a little more complex than my simple example implied.

This is a more typical example -

    (EVT_GETLOGIN
    ,EVT_LOGOUT
    ,EVT_GETMENUOPT
    ,EVT_GOTFOCUS
    ,EVT_LOSTFOCUS
    ,EVT_BUTTONCLICKED
    ,EVT_CHECKBOX
    ...
    ) = xrange(28)

    method_dict = {}
    method_dict[EVT_GETLOGIN] = onGetLogin
    method_dict[EVT_LOGOUT] = onLogout
    method_dict[EVT_GETMENUOPT] = onGetMenuOpt
    method_dict[EVT_GOTFOCUS] = onGotFocus
    method_dict[EVT_LOSTFOCUS] = onLostFocus
    method_dict[EVT_BUTTONCLICKED] = onButtonClicked
    method_dict[EVT_CHECKBOX] = onCheckBox

You can probably figure out from my method names what I am doing here - the messages are sent by a thin client (wxPython), and processed by a server.I am anticipating some "don't do that" responses, but I like the concept, and so far it is very fast and responsive, so I will pursue it for now.

Thanks for the input.

Frank


Any time I see multiple lists like that which have to stay in synch, I think code-smell.

Why not let the EVT's be passed as strings, and avoid the whole mapping to integers and mapping back detail? And name the methods involved in a way that you can directly translate the string to the method name?

Barring that, make a single "structure" which lists the event names and method names in matched pairs, and derive whatever lists and dictionaries you actually need from that one structure. And that structure should be shared between client and server code, perhaps as a text file that they both parse. Or as a stream that's passed from one to the other during startup. That way, consistency between them can be regulated (with version string in the file, for example)

DaveA

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to