Більшість відповідей тут досить старі, і особливо прийняті, тому, здається, варто оновити.
По-перше, офіційний 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 питання випуску справ у стилі С, або навіть трохи більш потужна версія Go, вважалася мертвою; всякий раз, коли хто-небудь підводить це на ідеях python або -dev, вони посилаються на старе рішення.
Однак ідея повного узгодження шаблону стилю ML виникає кожні кілька років, тим більше, що такі мови, як Swift та Rust, прийняли його. Проблема полягає в тому, що важко отримати багато користі від узгодження шаблонів без алгебраїчних типів даних. Хоча Гвідо прихильно ставився до цієї ідеї, ніхто не придумав пропозиції, яка дуже добре вписується в Python. (Ви можете прочитати мій соломник 2014 року для прикладу.) Це може змінитись dataclass
у 3.7 та деяких спорадичних пропозиціях щодо більш потужних enum
для обробки типів суми або з різними пропозиціями щодо різних типів місцевих прив’язок (наприклад, PEP 3150 або сукупність пропозицій, що зараз обговорюються на -іді). Але поки що.
Також періодично пропонуються відповідність стилю 6-го стилю Perl, який, в основному, є метеоризмом всього, починаючи від elif
регулярного виведення та перемикання типу одноразового перемикання.