New syntax for blocks
Steven D'Aprano
steven at REMOVE.THIS.cybersource.com.au
Wed Nov 11 00:37:13 EST 2009
On Tue, 10 Nov 2009 20:13:21 -0800, Carl Banks wrote:
> On Nov 10, 7:12 pm, Steven D'Aprano
> <ste... at REMOVE.THIS.cybersource.com.au> wrote:
>> On Tue, 10 Nov 2009 12:45:13 -0800, Bearophile wrote:
>> > r:
>>
>> >> i think the following syntax would be quite beneficial to replace
>> >> some redundant "if's" in python code.
>>
>> >http://python.org/dev/peps/pep-3003/
>>
>> I knew it wouldn't take long for people to start responding to any
>> proposal with "don't bother, there's a moratorium".
>>
>> Of course in this case, the correct response would have been "don't
>> bother, it's a stupid idea, moratorium or no moratorium".
>
> r didn't actually give a good example. Here is case where it's actually
> useful. (Pretend the regexps are too complicated to be parsed with
> string method.)
>
> if re.match(r'go\s+(north|south|east|west)',cmd) as m:
> hero.move(m.group(1))
> elif re.match(r'take\s+(\w+)',cmd) as m:
> hero.pick_up(m.group(1))
> elif re.match(r'drop\s+(\w+)',cmd) as m:
> here.put_Down(m.group(1))
This is where a helper function is good. You want a dispatcher:
COMMANDS = {
r'go\s+(north|south|east|west)': hero.move,
r'take\s+(\w+)': hero.pick_up,
r'drop\s+(\w+)': here.put_Down,
}
def dispatch(cmd):
for regex in COMMANDS:
m = re.match(regex, cmd)
if m:
COMMANDS[regex](m.group(1))
break
dispatch(cmd)
If you need the regexes to be tested in a specific order, change the dict
to an OrderedDict, or use a list of tuples and the obvious change to the
for loop.
--
Steven
More information about the Python-list
mailing list