LINUX.ORG.RU
ФорумTalks

Питонисты против switch'ей

 match, ,


0

2

После анонса изменений готовящейся версии Python 3.10 многие люди решили, что в Python наконец-то завезли switch'и. Что приводит профессиональных питонистов в негодование. Они уверяют, что switch'и это моветон и в Питон завезли именно match ... case, а не swith'и и как switch'ами ими пользоваться не надо:

Python's pattern matching was never really designed with the intent of powering C-style switch statements like this; that's been proposed for Python (and rejected) twice before, so we chose to go in a different direction. Besides, there is already one obvious way to switch on a single value, which is simpler, shorter, and works on every version of Python: a good-ol' if/elif/else ladder! (If you're really concerned about performance or need an expression, dispatching from a dictionary is also a fine alternative.)

★★★★★

Какая разница? Пока питон (mypy, pytype, что там ещё) не научится проверять что этот match..case исчерпывающий, оно от if..elif не настолько сильно отличается.

x3al ★★★★★
()

a good-ol’ if/elif/else ladder!

Ахаха.

If you’re really concerned about performance

I’m really concerned about fuckin’ readability.

cocucka ★★★★☆
()
Ответ на: комментарий от x3al

не научится проверять что этот match..case исчерпывающий, оно от if..elif не настолько сильно…

Так в сишке, плюсах и аде это сделано на этапе компиляции. А в питоне в рантайме проверять? И что если не все значения покрыты, ворнинг в стандартные ошибки писать? Падать? Богу молиться?

seiken ★★★★★
()
Ответ на: комментарий от mimico

Это когда ты добавляешь в какой-нибудь enum новый вариант, а CI тебе говорит: «Этот enum пользуется вон в том match и у тебя там теперь Incomplete pattern matches on this expression» и фейлится пока не допишешь.

Собственно, https://www.python.org/dev/peps/pep-0622/#exhaustiveness-checks тут это есть, но в питоне сложно сделать какие-либо гарантии.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от x3al

Это когда ты добавляешь в какой-нибудь enum новый вариант, а CI тебе говорит: «Этот enum пользуется вон в том match и у тебя там теперь Incomplete pattern matches on this expression» и фейлится пока не допишешь

Объективно, в питоне есть намного более серьезные проблемы проверки логической целостности, даже всякими mypy, чем шалости вроде неполного покрытия значений switch/match-ем.

byko3y ★★★★
()
Ответ на: комментарий от x3al

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

seiken ★★★★★
()

Не все ли тебе равно как называется фича, если она нормально работает? Или ты из этих, которые переименовывают master в main, а slave в worker?

Aswed ★★★★★
()

Ну питоновский match действительно не аналогичен switch из других ЯП, хотя внешне похож. И это неслабый foot gun.

PolarFox ★★★★★
()
Ответ на: комментарий от Aswed

Не все ли тебе равно как называется фича

Тут не только в названиях разница. Это разные реализации разного.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

А в чем принципиальная разница pattern matching и switch? Ну кроме того, что switch в си-подобных языках работает только по примитивам типа int-ов и потому может быть оптимизирован компилятором в goto таблицу.

Aswed ★★★★★
()
Ответ на: комментарий от mimico

Да и пёс с ней. Переменной можно присвоить объект произвольного типа, так что со статическими проверками типов туговато.

seiken ★★★★★
()

there is already one obvious way to switch on a single value, which is simpler, shorter, and works on every version of Python: a good-ol’ if/elif/else ladder!

Ахахахах. Лол. И эти вот люди ещё что-то там вякают что все должны учить питон. Язык - говно, синтаксис - говно, и специалисты с такими офигенными советами - тоже говно.

DawnCaster ★★
()
Ответ на: комментарий от seiken

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

Хороший статический анализатор намекнёт, что для сложных случаев лучгше бы аннотировать некоторые типы руками в этом случае. Mypy — фиговый анализатор (идея считать неаннотированный код Any и не пытаться выводить типы — так себе), но pytype вполне разруливает некоторые из подобных ситуаций.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Хороший статический анализатор

А нужны ли все эти статические костыли интерпретируемому языку с динамической системой типов? Хочешь статики - бери язык со статической системой типов.

seiken ★★★★★
()
Ответ на: комментарий от seiken

Обычно про них вспоминают когда кто-то написал PoC на питоне, забыл переписать его на чём-то вменяемом а этот PoC уже три года как в продакшне и в нём 200к строк питонокода.

x3al ★★★★★
()
Ответ на: комментарий от x3al

«Этот enum пользуется вон в том match и у тебя там теперь Incomplete pattern matches on this expression» и фейлится пока не допишешь.

Ага, и ты дописываешь noop туда.

Говнокодеров что ли не знаешь? Будто первый год в IT.

wandrien ★★
()
Ответ на: комментарий от mimico

Пито это язык с сильной, а не слабой типизацией.

Программисты бывают умные и сильные?

wandrien ★★
()
Ответ на: комментарий от Aswed

А в чем принципиальная разница pattern matching и switch? Ну кроме того, что switch в си-подобных языках работает только по примитивам типа int-ов и потому может быть оптимизирован компилятором в goto таблицу.

В тред врывается bash со строковым паттерн матчингом. xD

Мы паттерн матчили звёздочками в case esac еще до того, как это слово стало баззвордом.

wandrien ★★
()
Ответ на: комментарий от x3al

Ну так этот noop более заметен в code review.

Это если он есть не только на бумаге… Ладно, убедил.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от x3al

Обычно про них вспоминают когда кто-то написал PoC на питоне, забыл переписать его на чём-то вменяемом а этот PoC уже три года как в продакшне и в нём 200к строк питонокода.

Зачастую там код уровня «Работает? Не трожь!», и чем это рефакторить и обвешивать костылями тайпчекера, дешевле сразу начать помодульно переписывать на нормальный ЯП.

wandrien ★★
()
Ответ на: комментарий от DawnCaster

Ахахахах. Лол. И эти вот люди ещё что-то там вякают что все должны учить питон. Язык - говно, синтаксис - говно, и специалисты с такими офигенными советами - тоже говно.

Это, конечно, сильно экспрессивно, но так и есть. Я удивлён, что это для кого-то открытием стаёт.

Коротко: на питоне пишут те, у кого не хватает квалификации понять, что этого делать ни в коем случае не надо.

Ну или по необходимости поддерживать уже наваленную кодовую базу, тут уж никуда не денешься.

И Питон, к сожалению, с нами очень надолго.

wandrien ★★
()
Ответ на: комментарий от saahriktu

Для тех кто прям совсем вот не хочет кодить как в 90-е уже изобрели яваскрипт. Или вот недавно - GO.

DawnCaster ★★
()
Последнее исправление: DawnCaster (всего исправлений: 1)
Ответ на: комментарий от wandrien

Это, конечно, сильно экспрессивно, но так и есть.

Немного наболело после «необходимости поддерживать уже наваленную кодовую базу»

DawnCaster ★★
()
Ответ на: комментарий от saahriktu

Это вообще к чему? Там говорится не про switch как альтернативу проверке по шаблону, а про ООП кейсы с полиморфизмом.

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от Aswed

а про ООП кейсы с полиморфизмом.

А ООП (а в первую очередь наследование классов) так вообще надо выкинуть в большинстве случаев. Потому что это в большинстве случаев использование ООП приводит к преждевременному и искуственному описанию классов и негибкости, если что-то поменялось.

cvs-255 ★★★★★
()
Последнее исправление: cvs-255 (всего исправлений: 2)
Ответ на: комментарий от wandrien

на питоне пишут те, у кого не хватает квалификации понять, что этого делать ни в коем случае не надо.

максималистические глупости, хотя обычное тут дело

fornlr ★★★★★
()
Ответ на: комментарий от Aswed

Там по ссылке раскрыты преимущества pattern matching, которых нет у switch'ей.

saahriktu ★★★★★
() автор топика

Я так наоборот, джвенаджать лет свичей ждал. И чтобы корованы.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от x3al

Это когда ты добавляешь в какой-нибудь enum новый вариант, а CI тебе говорит: «Этот enum пользуется вон в том match и у тебя там теперь Incomplete pattern matches on this expression» и фейлится пока не допишешь.

То есть в динамическом языке паттерн матчинг невозможен?

mimico
()
Ответ на: комментарий от x3al

Обычно про них вспоминают когда кто-то написал PoC на питоне, забыл переписать его на чём-то вменяемом а этот PoC уже три года как в продакшне и в нём 200к строк питонокода.

Именно потому что не было обязятельной статики, можно было хреначить быстро типы данных, лишь бы PoC работал. Была бы статика - не было бы PoC, вернее был бы, но заняло бы дольше. А время - деньги. И, возвращаясь к глубинному смыслу ПО, в этом и был смысл разработки - поиметь проблемы в конце концов. Другого, «хорошего», смысла нет.

Про 200К на питоне - это где такое? Там же уже после пары тысяч строк портянок крыша едет, если исходник человеком создан, а не генерится автоматом.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от seiken

Типизация в питоне сильная, динамическая. Не путай понятия. А для (говённого) статического анализа есть тайпхинты и вышеупомянутый mypy. Да и до него линтеры, в частности pylint, со многим справлялись.

Не позорься, не теоретизируй о том, что в глаза никогда не видел даже.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от seiken

10-30 тыщ строк — нормально. А дальше действительно трешачок, если оно не сильно модульное. И тут mypy худо-бедно, но помогает.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Да-да, динамическая. Из поста было и так ясно, о чем я писал.

И тут mypy худо-бедно, но помогает.

Допустим. Но как это поможет с обнаружением неиспользованных вариантов в match?

seiken ★★★★★
()
Ответ на: комментарий от seiken

Так хинты же есть, уверен, хотя бы что-то примитивное сделают уже довольно скоро. И что значит «неиспольванных»? Есть же аналог default, если он задан, то вопросов нет. Важнее понимать, что матчат не ужа с ежом. Тут хинты и помогут.

WitcherGeralt ★★
()
Ответ на: комментарий от seiken

Про 200К на питоне - это где такое?

/me смотрит на один проект с 500к одного питона на джанге.

Ну… Некоторым платят за ковыряние в легаси.

x3al ★★★★★
()

Удивительно, насколько несущественных отличий людям достаточно, чтобы устраивать срачи. Да такой же этот match как switch. Всё равно что то что другое это просто сахар. Есть switch, которые могут составлять козла с носорогом, есть свитчи как в С. Разное есть.

Самое смешное, что каждый язык хочет наворотить свой подход в мелочах. Зачем это вообще? Ну сделали бы единообразно. А за пару десятков лет можно было бы вообще слить все мейнстримные языки в один. Смысл держать весь этот зоопарк?

ixrws ★★★
()
Ответ на: комментарий от WitcherGeralt

Блин, не матч, а свитч. Короче, см. пример.

Важнее понимать, что матчат не ужа с ежом. Тут хинты и помогут.

Как они помогут. Вот, например:

#!/usr/bin/python3

def f(x: int) -> bool:
    if x > 10:
        return 3.14 # Линтер не жалуется
    else: # Тут линтер пожаловался, что типа необязательное else, а мне так удобнее читать
        return None # Линтеру пофиг

switch f(9):
    case True: # большой и старый уж
        # true here
        pass
    case False: # маленькой и молодой уж
        # false here
    # ой, а это же был еж!
seiken ★★★★★
()
Ответ на: комментарий от seiken

return 3.14 # Линтер не жалуется

А должен.

return None # Линтеру пофиг

Сфига? У тебя bool, а не Optinal[bool].

И что ты собственно под линтером подразумеваешь? Явно не mypy же, да?

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от ixrws

Смысл разнообразия в том, чтобы не застревать в 90-х и юзать новые более высокоуровневые методы. Например, юзать всякие .sort() вместо того, чтобы каждый раз велосипедить пузырьковую сортировку с перебором элементов массива в for.

Синтаксис Питона таков, какой он есть, потому, что его разработчики боролись за читаемость кода. Чтобы было меньше неоднозначностей и запутанностей. Исходя из этого часть того, что существовало в других языках, и не было принято в Питон.

Более того, есть куча других аргументов против switch/case. Вплоть до того, что такой код сложнее дебажить. И вот такого тоже:

Most programming languages have switch/case because they don't have proper mapping constructs. You cannot map a value to a function, that's why they have it.

But in Python, you can easily have a mapping table(dict) where a certain value maps to a certain function. Python functions are first class values, you can use the functions as the values of the dictionary get(key[, default]) method. Performance-wise, the Python dictionary lookup will almost certainly be more efficient than any solution you can rig yourself.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

But in Python, you can easily have a mapping table(dict) where a certain value maps to a certain function.

Нет, никакой не «but». В рубине есть и case, и словари.

seiken ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.