Недавно я видел в Интернете некоторые дискуссии о том, что в Python нет хорошего эквивалента «переключатель / регистр».Я понимаю, что есть несколько способов сделать что-то подобное - некоторые с помощью лямбды, некоторые со словарями.Были и другие обсуждения StackOverflow об альтернативах.Были даже два PEP (PEP 0275 и PEP 3103), обсуждающие (и отвергающие) интеграцию switch / case в язык.
Я придумал элегантный способ сделать switch / case.
В конечном итоге это выглядит так:
from switch_case import switch, case # note the import style
x = 42
switch(x) # note the switch statement
if case(1): # note the case statement
print(1)
if case(2):
print(2)
if case(): # note the case with no args
print("Some number besides 1 or 2")
Итак, мои вопросы: это стоящее создание?Есть ли у вас какие-либо предложения по его улучшению?
Я поместил включаемый файл на github вместе с обширными примерами.(Я думаю, что весь включаемый файл составляет около 50 исполняемых строк, но у меня есть 1500 строк примеров и документации.) Я перерабатывал эту вещь и тратил кучу времени, или кто-то найдет это стоящим?
Редактировать:
Попытка объяснить, почему это отличается от других подходов:
1) Возможно несколько путей (выполнение двух или более случаев), что сложнее в методе словаря.
2) может выполнять проверку для сравнения, отличного от «равно» (например, case (less_than (1000)).
3) Более читабельно, чем метод словаря, и, возможно, если метод / elif
4) может отслеживать, сколько Trueслучаи были.
5) может ограничивать количество истинных случаев.(т.е. выполнить первые 2 истинных случая ...)
6) допускает случай по умолчанию.
Вот более сложный пример:
from switch_case import switch, case, between
x=12
switch(x, limit=1) # only execute the FIRST True case
if case(between(10,100)): # note the "between" case Function
print ("%d has two digits."%x)
if case(*range(0,100,2)): # note that this is an if, not an elif!
print ("%d is even."%x) # doesn't get executed for 2 digit numbers,
# because limit is 1; previous case was True.
if case():
print ("Nothing interesting to say about %d"%x)
# Running this program produces this output:
12 has two digits.
Вот пример, пытающийся показать, как switch_case может быть более понятным и лаконичным, чем обычный if / else:
# conventional if/elif/else:
if (status_code == 2 or status_code == 4 or (11 <= status_code < 20)
or status_code==32):
[block of code]
elif status_code == 25 or status_code == 45:
[block of code]
if status_code <= 100:
[block can get executed in addition to above blocks]
# switch_case alternative (assumes import already)
switch(status_code)
if case (2, 4, between(11,20), 32): # significantly shorter!
[block of code]
elif case(25, 45):
[block of code]
if case(le(100)):
[block can get executed in addition to above blocks]
Большая экономия заключается в длинных операторах if, когда один и тот же переключатель повторяется снова и снова.Не знаю, насколько часто встречается такой вариант использования, но, похоже, в некоторых случаях это имеет смысл.
Файл примера на github содержит еще больше примеров.