Сначала рассмотрим , почему в Python нет оператора case . Так что перезагрузите свой мозг и забудьте о них.
Вы можете использовать класс объектов, декораторы функций или словари функций для достижения тех же или лучших результатов.
Вот простой пример:
#!/usr/bin/env python
import re
def hat(found):
if found: print "found a hat"
else: print "no hat"
def cat(found):
if found: print "found a cat"
else: print "no cat"
def dog(found):
if found: print "found a dog"
else: print "no dog"
st="""
Here is the target string
with a hat and a cat
no d o g
end
"""
patterns=['hat', 'cat', 'dog']
functions=[hat,cat,dog]
for pattern,case in zip(patterns,functions):
print "pattern=",pattern
case(re.search(pattern,st))
Операторы case / switch в стиле C также "проваливаются", такие как:
switch(c) {
case 'a':
case 'b':
case 'c': do_abc();
break;
... other cases...
}
Используя кортежи и списки вызываемых объектов, вы можете получить похожее поведение:
st="rat kitten snake puppy bug child"
def proc1(st): print "cuddle the %s" % st
def proc2(st): print "kill the %s" % st
def proc3(st): print "pick-up the %s" % st
def proc4(st): print "wear the %s" % st
def proc5(st): print "dispose of the %s" %st
def default(st): print "%s not found" % st
dproc={ ('puppy','kitten','child'):
[proc3, proc1],
('hat','gloves'):
[proc3, proc4],
('rat','snake','bug'):
[proc2, proc3, proc5]}
for patterns,cases in dproc.iteritems():
for pattern in patterns:
if re.search(pattern,st):
for case in cases: case(pattern)
else: default(pattern)
print
Получается правильный порядок для найденного предмета: 1) забрать ребенка, обнять ребенка; 2) убить крысу, поднять крысу ... Было бы трудно сделать то же самое с оператором C в понятном синтаксисе.
Есть много других способов имитировать оператор C switch. Вот один (для целых чисел), использующий декораторы функций:
case = {}
def switch_on(*values):
def case_func(f):
case.update((v, f) for v in values)
return f
return case_func
@switch_on(0, 3, 5)
def case_a(): print "case A"
@switch_on(1,2,4)
def case_b(): print "case B"
def default(): print "default"
for i in (0,2,3,5,22):
print "Case: %i" % i
try:
case[i]()
except KeyError:
default()
Перефразируя Ларри Уолла, Тома Кристиансена, Джона Орванта в Программирование на Perl относительно понимания контекста в Perl:
Вы будете жалким программистом на Python, пока не будете использовать идиомы, родные для языка ...