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.)

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

В pylint есть type checker. Но пес с ним, с линтером. Как пример проверить статически, чтобы обнаружить, что switch занят ужами, а должен быть занят ежами и еще черт знает, чем?

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

А в питоне в рантайме проверять?

Питон же в байткод компилируется.
Вот и развернуть этот match в портянку if-else в байткоде.

Shadow ★★★★★
()

Мне больше интересно как быть со знаком «_». В основном этот знак используют для сокращенного вызова ugettext, иногда используют этот символ, если функция возвращает кортеж из двух значений, а необходимо или первое или второе значение.

match subject:
    case <pattern_1>:
        <action_1>
    case _:
        <action_wildcard>
dicos ★★
()
Ответ на: комментарий от saahriktu

F#

Pattern matching provides exhaustiveness and redundancy checking

Зачем приводить ссылки на вообще другой язык? Так всё же, чем питоновский pattern matching отличается от switch-case?

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

От GOTO начали избавляться ещё с конца 1960-х. Он был нужен разве что в тех диалектах Basic'а, где не было функций. С приходом структурного программирования, в т.ч. Си и Паскаля, от GOTO начали избавляться ещё активнее.

http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/pp/ewd215.html

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

Затем, что там всё равно раскрыто чем pattern matching отличается от switch'ей.

Так всё же, чем питоновский pattern matching отличается от switch-case?

Тем же, чем он отличается от switch'ей в любом языке.

Вон, недавно половину рунета при блокировке Twitter'а уронили те, кто не понимали отличие pattern matching'а от switch'ей.

Они вписали «t.co» туда, где, как они думали, switch, а там оказался pattern matching. В результате дубинка замедления прилетела на *t.co*, а не конкретно только на t.co.

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

Затем, что там всё равно раскрыто чем pattern matching отличается от switch’ей.

Для F#. Я думал приведённый мной пункт из вашей ссылки покажет, что то что называют pattern matching в F# отличается от того что называют pattern matching в питоне. Я привел один, хотя там больше. Было бы наивно полагать, что взяв какой-нибудь кодогенератор и спрятав портянку if…elif за красивым названием pattern matching, эта конструкция получит все фичи реального pattern matching’а. Я не утверждаю, что так и сделано в питоне, мне просто интересно как оно устроено, я загуглил, но нашёл только примеры использования, которые ничем особо не отличались от switch..case. Вот и прошу привести ссылку тех кто в теме. А то получается «чтобы понять Х в питоне пройдите и прочитайте про Х в F#. прочитали? так вот в питоне всё совсем иначе!»

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

Вы не поверите, но и сегодня есть места, где учат даже не Free Pascal'ю, а Turbo Pascal'ю. И что теперь?

Разработчики современных языков программирования борются за их чистоту и не пропускают в них всякие атавизмы наподобие GOTO.

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

Каким еще линтером?

Который даже на TODO ругается.

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

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

Можно пример синтаксиса такого вызова?

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

Слова это просто слова, смотрите:

Реализация оператора в Python очень сильно напоминает то, как устроен switch В Java

Я не знаком с F#, но судя по приведённой вами ссылке, у pattern matching Rust и F# действительно много общего. И ничего общего с Python я не вижу. Ссылка будет?

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

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.

std::unordered_map<Key, std<function<void()>>> смотрит на этот ‘but’ со смесью любопытства и негодования.

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

Так это они просто очень многословно и витиевато сообщили простое мнение: не нужно. «Да, у нас нет свитча… Но зато у нас функции - first class values!!!» В огороде бузина, а в Киеве дядька. Ты не туда смотри, ты сюда смотри.

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

Дефицит примеров потому, что Python 3.10 пока ещё не вышел. Поэтому на нём пока ещё никто не пишет. Пока что можно только доверять словам тех, кто знаком с кухней и кто знает что именно на ней готовится.

И они уверяют, что в Python'е 3.10 готовится такой же pattern matching, как и в Scala, Rust и F#. Что этот путь выбран именно потому, что со switch'ами им не по пути. Предложения о реализации switch'ей в Python'е несколько раз уже были отвергнуты, и потому разработчики решили реализовать точно такой же match как и в Scala, Rust и F#.

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

в Python’е 3.10 готовится такой же pattern matching, как и в Scala, Rust и F#

При условии идеальных аннотаций типов и идеальной имплементации в тайпчекерах, ага.

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

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

Остается только понять, как же так получилось, что самый рейтинговый в мире ВУЗ для своего вводного курса по программированию выбрал именно это «говно»… Это агония мировой цивилизации?

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

Проблема испльзования goto уже давно не актуальна. goto не используется там, где не надо, и используется там, где надо. Это только для людей, застрявших в 60-70гг это актуальная проблема.

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

… вводного курса …

Никаких противоречий тут нет. Напомню, что и basic которому в вузах раньше повсеместно учили - тоже как-бы «учебный» язык.

Питон сейчас как и бейсик тогда имеет низкий порог вхождения. Так что для начала пойдет. Главное чему научат студента после питона, и самое главное научат-ли его умению само-обучаться.

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

Это агония мировой цивилизации?

Вот это очень дискуссионный вопрос. А что если и да ?

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

Они вписали «t.co» туда, где, как они думали, switch, а там оказался pattern matching. В результате дубинка замедления прилетела на t.co, а не конкретно только на t.co.

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

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

Тред таки не пустой. Он заранее предупреждает тех, кто ожидают появления switch'ей в Python'е, что их там не будет. Это дезинформация. В Python'е 3.10 появится не switch, а pattern matching. Тем, кто не понимает разницы, таки следует её для себя уяснить.

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

Наплодили много полезного. Просто кто-то плохо учился.

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

А дезинформируют везде, в т.ч. и на ЛОРе. Даже я не разобравшись дезинформировал на ЛОРе по поводу. Потому и сделал отдельную тему с опровержением.

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

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

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