Большинство ответов здесь довольно старые, особенно принятые, поэтому, кажется, стоит обновить.
Во-первых, официальный FAQ по Python охватывает это и рекомендует elif
цепочку для простых случаев и dict
для больших или более сложных случаев. Он также предлагает набор visit_
методов (стиль, используемый многими серверными платформами) для некоторых случаев:
def dispatch(self, value):
method_name = 'visit_' + str(value)
method = getattr(self, method_name)
method()
В FAQ также упоминается PEP 275 , который был написан, чтобы получить официальное разовое решение о добавлении операторов переключения в стиле C. Но этот PEP был фактически отложен до Python 3, и он был официально отклонен только как отдельное предложение, PEP 3103 . Ответ был, конечно, нет - но у двух PEP есть ссылки на дополнительную информацию, если вас интересуют причины или история.
Одна вещь, которая возникала несколько раз (и это можно увидеть в PEP 275, даже если это было вырезано как реальная рекомендация), заключается в том, что если вам действительно надоело иметь 8 строк кода для обработки 4 случаев по сравнению с 6 строки, которые вы бы имели в C или Bash, вы всегда можете написать так:
if x == 1: print('first')
elif x == 2: print('second')
elif x == 3: print('third')
else: print('did not place')
Это не совсем воодушевляет PEP 8, но он читабелен и не слишком однотипен.
За более чем десятилетие, с тех пор как PEP 3103 был отклонен, вопрос о заявлениях в стиле C или даже о более мощной версии в Go считался мертвым; всякий раз, когда кто-нибудь поднимает вопрос о python-ideas или -dev, они обращаются к старому решению.
Однако идея полного сопоставления с образцом в стиле ML возникает каждые несколько лет, особенно после того, как такие языки, как Swift и Rust, приняли ее. Проблема состоит в том, что трудно получить много пользы от сопоставления с образцом без алгебраических типов данных. Хотя Гвидо сочувствовал этой идее, никто не выдвинул предложение, которое очень хорошо вписывается в Python. (Вы можете прочитать моего соломенного человека 2014 года для примера.) Это может измениться dataclass
в 3.7 и некоторых спорадических предложениях для более мощных enum
для обработки типов сумм, или с различными предложениями для различных видов привязок локальных операторов (таких как PEP 3150 или множество предложений, обсуждаемых в настоящее время на -иде). Но пока это не так.
Также иногда появляются предложения по сопоставлению в стиле Perl 6, что, по сути, является путаницей всего, от elif
регулярных выражений до однократного переключения типов.