from functools import partial
class DispatchError(Exception):
pass
class Dispatcher:
def __init__(self, prefix='on_'):
self._prefix = prefix
def on_default(self, method, *args, **kw):
raise DispatchError('"{}" undefined.'.format(method))
def __call__(self, method, *args, **kw):
return getattr(
self,
self._prefix + method,
partial(self.on_default, method)
)(*args, **kw)
class ActorDispatcher(Dispatcher):
def on_move(self, *args, **kw):
print('moving...')
def on_attack(self, *args, **kw):
print('attacking..')
# etc...
print( list( map(
ActorDispatcher(), ['move', 'attack'] * 2
)))
ZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKCmNsYXNzIERpc3BhdGNoRXJyb3IoRXhjZXB0aW9uKToKCXBhc3MKCmNsYXNzIERpc3BhdGNoZXI6CglkZWYgX19pbml0X18oc2VsZiwgcHJlZml4PSdvbl8nKToKCQlzZWxmLl9wcmVmaXggPSBwcmVmaXgKCQoJZGVmIG9uX2RlZmF1bHQoc2VsZiwgbWV0aG9kLCAqYXJncywgKiprdyk6CgkJcmFpc2UgRGlzcGF0Y2hFcnJvcignInt9IiB1bmRlZmluZWQuJy5mb3JtYXQobWV0aG9kKSkKCQoJZGVmIF9fY2FsbF9fKHNlbGYsIG1ldGhvZCwgKmFyZ3MsICoqa3cpOgoJCXJldHVybiBnZXRhdHRyKAoJCQlzZWxmLAoJCQlzZWxmLl9wcmVmaXggKyBtZXRob2QsCgkJCXBhcnRpYWwoc2VsZi5vbl9kZWZhdWx0LCBtZXRob2QpCgkJKSgqYXJncywgKiprdykKCmNsYXNzIEFjdG9yRGlzcGF0Y2hlcihEaXNwYXRjaGVyKToKCWRlZiBvbl9tb3ZlKHNlbGYsICphcmdzLCAqKmt3KToKCQlwcmludCgnbW92aW5nLi4uJykKCWRlZiBvbl9hdHRhY2soc2VsZiwgKmFyZ3MsICoqa3cpOgoJCXByaW50KCdhdHRhY2tpbmcuLicpCgkjIGV0Yy4uLgoKcHJpbnQoIGxpc3QoIG1hcCgKCUFjdG9yRGlzcGF0Y2hlcigpLCBbJ21vdmUnLCAnYXR0YWNrJ10gKiAyCikpKQ==