Оператор switch считается вредным. Наверное, поэтому в Python его нет. Поверхностное поведение является основным источником ошибок в C-коде. break;
легко забыть. Вот почему C # запрещает его - вам придется использовать вместо него явный goto
. То же самое в подходе Python к функциям. Вы вводите вызов следующей функции. «Явное лучше, чем неявное».
Самый простой способ навязать функции (с помощью ключей идентификаторов) - это объявление class
.
class switch:
def a():
print('a')
switch.b()
def b():
print('b')
switch.c()
def c():
print('c')
def d():
switch.e()
def e():
print('de')
def f():
switch.g()
def g():
print('fg')
def h():
print('h')
def i():
print('i')
switch.default()
def default():
print('foo')
Используйте это так.
>>> expression = 'a'
>>> getattr(switch, expression, 'default')()
a
b
c
Вы также можете извлечь атрибут __dict__
, если вам нужен фактический диктант.
>>> switch.__dict__.get('e', 'default')()
de
Вы также можете быть явным образом с if
заявлениями.
def switch(case)
if case == a:
doA()
case = b
if case == b:
doB()
case = c
if case == c:
doC()
return
if case == d:
case = e
if case == e:
doDE()
return
if case == f:
case = g
if case == g:
doFG()
case = h
if case == h:
doH()
return
if case == i:
doI()
foo()
Если вы беспокоитесь о побочных эффектах, изменяющих условие, или если условия являются более сложными, чем простое равенство, и вы не хотите повторять их, вы можете использовать вспомогательную переменную вместо переназначения case
.
def switch(case):
fall = False
if case == a:
doA()
fall = True
if fall or case == b:
doB()
fall = True
if fall or case == c:
doC()
return
if case == d:
fall = True
if fall or case == e:
doDE()
return
if case == f:
fall = True
if fall or case == g:
doFG()
fall = True
if fall or case == h:
doH()
return
if case == i:
doI()
foo()