Замены для оператора switch в Python?

Вы можете использовать это регулярное выражение (любые пробелы или любые небелые пробелы) как можно дольше и вплоть до 0.

[\s\S]*

Это выражение будет соответствовать как можно меньше, но как многие, необходимые для остальной части выражения.

[\s\S]*?

Например, в этом регулярном выражении [\s\S]*?B будет соответствовать aB в aBaaaaB. Но в этом регулярном выражении [\s\S]*B будет соответствовать aBaaaaB в aBaaaaB.

1719
задан codeforester 28 September 2018 в 17:16
поделиться

8 ответов

Вы могли использовать словарь:

def f(x):
    return {
        'a': 1,
        'b': 2,
    }[x]
1361
ответ дан Greg Hewgill 28 September 2018 в 17:16
поделиться

Мне всегда нравилось делать его этот путь

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}[value](x)

Отсюда

357
ответ дан binarysubstrate 28 September 2018 в 17:16
поделиться

Если Вы хотели бы значения по умолчанию, Вы могли бы использовать словарь get(key[, default]) метод:

def f(x):
    return {
        'a': 1,
        'b': 2
    }.get(x, 9)    # 9 is default if x not found
1277
ответ дан Nilpo 28 September 2018 в 17:16
поделиться

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

, О, и если Вы испытываете желание делать что-то подобное переключателю, см. здесь .

0
ответ дан Solomon Ucko 28 September 2018 в 17:16
поделиться

В дополнение к методам словаря (который я действительно как, BTW), можно также использовать if-elif-else для получения функциональности переключателя/случая/значения по умолчанию:

if x == 'a':
    # Do the thing
elif x == 'b':
    # Do the other thing
if x in 'bc':
    # Fall-through by not using elif, but now the default case includes case 'a'!
elif x in 'xyz':
    # Do yet another thing
else:
    # Do the default

Это, конечно, не идентично переключателю/случаю - Вы не можете иметь, проваливаются так же легко как бросающий повреждение; оператор, но у Вас может быть более сложный тест. Его форматирование более хорошо, чем серия вложенной IFS, даже при том, что функционально вот что это значит ближе к.

304
ответ дан Matthew Schinckel 28 September 2018 в 17:16
поделиться

подробно останавливаясь "dict как переключатель" идея. если Вы хотите использовать значение по умолчанию для своего переключателя:

def f(x):
    try:
        return {
            'a': 1,
            'b': 2,
        }[x]
    except KeyError:
        return 'default'
16
ответ дан Jeremy Cantrell 28 September 2018 в 17:16
поделиться

Существует шаблон, который я узнал из Скрученного кода Python.

class SMTP:
    def lookupMethod(self, command):
        return getattr(self, 'do_' + command.upper(), None)
    def do_HELO(self, rest):
        return 'Howdy ' + rest
    def do_QUIT(self, rest):
        return 'Bye'

SMTP().lookupMethod('HELO')('foo.bar.com') # => 'Howdy foo.bar.com'
SMTP().lookupMethod('QUIT')('') # => 'Bye'

можно использовать его любое время, которое необходимо диспетчеризировать на маркере и выполнить расширенную часть кода. В конечном автомате Вы имели бы state_ методы и отправка на self.state. Этот переключатель может быть чисто расширен путем наследования базовому классу и определения собственного do_ методы. Часто времена Вы не будете даже иметь do_ методы в базовом классе.

Редактирование: как точно то, который использовал

В случае SMTP, Вы получите HELO от провода. Соответствующие нормы (от twisted/mail/smtp.py, измененный для нашего случая) похожи на это

class SMTP:
    # ...

    def do_UNKNOWN(self, rest):
        raise NotImplementedError, 'received unknown command'

    def state_COMMAND(self, line):
        line = line.strip()
        parts = line.split(None, 1)
        if parts:
            method = self.lookupMethod(parts[0]) or self.do_UNKNOWN
            if len(parts) == 2:
                return method(parts[1])
            else:
                return method('')
        else:
            raise SyntaxError, 'bad syntax'

SMTP().state_COMMAND('   HELO   foo.bar.com  ') # => Howdy foo.bar.com

, Вы получите ' HELO foo.bar.com ' (или Вы могли бы добраться 'QUIT' или 'RCPT TO: foo'). Это маркируется в [1 111] как [1 112]. Фактическое имя поиска метода взято от [1 113].

(Исходный метод также называют state_COMMAND, потому что он использует тот же шаблон для реализации конечного автомата, т.е. getattr(self, 'state_' + self.mode))

45
ответ дан 28 September 2018 в 17:16
поделиться

Решения, которые я использую:

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

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}.get(whatToUse, lambda x: x - 22)(value)

где

.get('c', lambda x: x - 22)(23)

ищет «лямбда x: x - 2» в словарном коде и использует его с x = 23

.get('xxx', lambda x: x - 22)(44)

не находит его в слове и использует по умолчанию «лямбда x: x - 22» с x = 44 .

11
ответ дан 22 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: