Как сделать Case / Switch в Python без всех разрывов и кода между 2 случаями - PullRequest
0 голосов

Я знаю Java и C и раньше использовал операторы Switch, но их нет в python.

Я вижу много способов использования if-elif-else для перекомпоновки, но любой, который переопределяет полностью.

Пример кода, который я хочу заменить.

switch(expression) {
   case a:
       doA();
   case b:
       doB();
   case c:
       doC();
       break;
   case d:
   case e:
       doDE()
       break;
   case f:
   case g:
       doFG():
   case h:
       doH();
       break;
   case i:
       doI();
   default:
       foo();
       break;
}

Как видите, не все дела следуют за разрывом, и между некоторыми делами есть код, который выполняется только в одном случае, но есть и общий код, который выполняется в обоих случаях.

Я вижу много способов, но любой, которые позволяют это одновременно. И я думаю, что это реальная разница между if-elif-else и switch-case.

Так что есть какой-нибудь способ сделать это, будет замечательно, или это возможно только при повторных вызовах функций и сложно, если со всеми возможностями?.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Оператор if может выполнить любое условие. Вы просто должны быть немного более явным.

def switch(case):
    if case in 'a':
        doA()
    if case in 'ab':
        doB()
    if case in 'abc':
        doC()
        return
    if case in 'de':
        doDE()
        return
    if case in 'fg':
        doFG()
    if case in 'fgh':
        doH()
        return
    if case in 'i':
        doI()
    foo()
0 голосов
/ 06 мая 2018

Оператор 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()
...