On Sat, 18 Dec 2004 03:05:08 -0500, "Terry Reedy" <[EMAIL PROTECTED]> wrote:
> >"Bengt Richter" <[EMAIL PROTECTED]> wrote in message >news:[EMAIL PROTECTED] >> Looks like your standard pattern could be updated: >> >> >>> dispatch = {} >> >>> >> >>> def dispvia(name): >> ... def _(f, name=name): >> ... dispatch[name] = f >> ... return f >> ... return _ >> ... >> >>> @dispvia('a') >> ... def handle_a(): pass >> ... >> >>> @dispvia('b') >> ... def handle_b(): pass >> ... >> >>> @dispvia('c') >> ... def handle_c(): pass >> ... >> >>> for t in sorted(dispatch.items()): print '%5s: %r'%t >> ... >> a: <function handle_a at 0x02EE8E9C> >> b: <function handle_b at 0x02EE8ED4> >> c: <function handle_c at 0x02EE8F0C> > >To avoid the redundancy of 'a' and '_a', etc, how about (untested): > >def dispvia(f): > dispatch[f.__name__.split('_')[1]] = f > return f > >? (Don't have 2.4 loaded yet) That should work. Didn't want to retype ;-) I just wanted to get to the experiment following -- did you notice that it takes the assignment name from each "def dispatch ...", but it is actually re-assigning the returned dispatch *dict* as the value, not a modified function? So no function was bound to any local name at any time. Kind of faking the lambda thing, and allowing non-identifier keys if desired. E.g., >>> dispatch = {} >>> def dispvia(name): ... def _(f, name=name): ... f.__name__ = repr(repr(name)) ... dispatch[name] = f ... return dispatch ... return _ ... >>> for k in xrange(3): ... @dispvia(k) ... def dispatch(key=k): return key ... >>> for t in sorted(dispatch.items()): print '%5r: %r' % t ... 0: <function '0' at 0x02EE8DBC> 1: <function '1' at 0x02EE8DF4> 2: <function '2' at 0x02EE8E2C> >>> for t in sorted(dispatch.items()): print '%r() => %r' % (t[1], t[1]()) ... <function '0' at 0x02EE8DBC>() => 0 <function '1' at 0x02EE8DF4>() => 1 <function '2' at 0x02EE8E2C>() => 2 Sort of the effect of >>> dispatch2 = dict((k,lambda key=k:key) for k in xrange(3)) >>> for t in sorted(dispatch2.items()): print '%20r:%r'%t ... 0:<function <lambda> at 0x02EE8FB4> 1:<function <lambda> at 0x02EF402C> 2:<function <lambda> at 0x02EF409C> Oops, well it's not so pretty if you want to rename the lambdas in the same expression: >>> dispatch2 = dict((k, setattr(f, '__name__', repr(repr(k)))or f) for k,f in >>> ((k,lambda key=k:key) for k in xrange(3))) >>> for t in sorted(dispatch2.items()): print '%20r:%r'%t ... 0:<function '0' at 0x02EE8FB4> 1:<function '1' at 0x02EF402C> 2:<function '2' at 0x02EF4064> >>> for t in sorted(dispatch.items()): print '%r() => %r' % (t[1], t[1]()) ... <function '0' at 0x02EE8DBC>() => 0 <function '1' at 0x02EE8DF4>() => 1 <function '2' at 0x02EE8E2C>() => 2 ;-/ Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list