# Почему я не люблю Python? 🐍

Обложка статьи "Почему я не люблю Python?"

# Предисловие

Честно говоря, я хотел использовать в названии глагол "хейтить", но не уверен, что смог бы правильно его просклонять 😃

Я действительно считаю себя немного хейтером Python и отношусь к нему со здоровым пессимизмом. Думаю, что на фоне его всепоглощающей распиаренности такие люди должны существовать, ведь вся шумиха вокруг Python приводит к тому, что каждый считает своим долгом изучить его. А между тем, Python довольно плохо годится на роль первого языка программирования, потому что при обучении программированию на Python с использованием хороших практик мы получаем кучку плохих кодеров, не понимающих (или, что ещё хуже, не считающих нужным понимать) фундаментальных вещей в программировании. А если не использовать хорошие практики, то зачем вообще учить именно Python?

Лично я испытываю слегка неприятные ощущения всякий раз, когда имею дело с Python. В большей мере это профдеформация, потому что весь свой опыт в программировании я имел дело с языками, которые отличаются от Python, где-то концептуально, где-то синтаксически.

Я давно хотел собрать фрагменты одной большой идеи, почему мне не нравится Python, в цельное мнение и оформить его. Наконец я это сделал. Знакомьтесь и комментируйте 😃

Дисклеймер

Мнение, высказанное в статье является по большей части субъективным. Статья не ставит целью доказать, что Python - плохой язык. Это просто набор фактов, которые заставляют меня грустить или злиться, когда я делаю что-то на Python.

# Объективные причины

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

# Скорость

Python чертовски медленный. Просто до безобразия! Я думаю, мало кто станет это отрицать. Да, существуют модули написанные на C, которые дают значительный прирост в скорости. При условии объединения этих модулей с той скоростью разработки, которую обеспечивает количество уже готовых библиотек для чего угодно на Python вы получаете правда очень впечатляющие возможности. Однако, это не отменяет тот факт, что сам Python безнадежно медленный.

Я обучаю программированию и довольно много раз видел, как попытка решения на Python задач, написанных, например, под курс C++ чистым алгоритмическим способом, который на C++ отрабатывает за считанные миллисекунды, на Python не проходит из-за ограничения по времени в 2 секунды, выставленного в чекере!

# Отступы

Да, я, безусловно, понимаю важность читаемости кода. Да, я безусловно, сторонник выравнивания кода красивой "лесенкой". Но, черт возьми, Python, дружище, я же не школьник, чтобы заставлять меня делать так и только так, как ты этого хочешь, просто потому что голландцам так нравится 😃

Более того, решение сделать отступы признаком вложенности сделало Python языком, на котором невозможно нормально писать без IDE или хотя бы более или менее продвинутого редактора кода. Я не могу открыть стандартный блокнот и вынести кусок кода в функцию, не превысив при этом свой моральный лимит на количество матерных слов в час.

# Несогласованная архитектура

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

Например, имея дело с JavaScript, который от стандарта к стандарту не стесняется черпать хорошие идеи из Python и функциональных языков программирования, я никогда не задумываюсь, что мне нужно использовать сейчас, метод или глобальную функцию, sort(a) или a.sort(). В Python же есть только один способ не думать об этом - набить руку и запомнить, что и в каком случае вам следует использовать.

# Банковское округление

Я преподаю Python наряду с другими языками программирования и в истории открытия этой особенности мне даже немного стыдно публично признаваться. В один прекрасный момент я с полной уверенностью объяснил ребятам различные способы округления вещественных чисел в Python и спокойно отправил их решать заготовленные задачки.

Сказать, что новость о том, что round(2.5) возвращает 2, а не 3 была для меня шоком и немного поломала мне урок - не сказать ничего. Да, я сам виноват и должен был основательнее подготовиться, но я и не ждал подвоха в таких элементарных вещах 🙂

Почему так? Знакомьтесь, перед вами банковское округление, которое, к слову, в Python используется повсеместно, это болезнь не только функции round(). То есть, например, print("{:.0f}".format(4.5)) тоже выведет вам 4.

Вы спросите, а как же тогда в Python сделать нормальное арифметическое округление? Крепитесь, встроенными средствами произвести арифметическое округление в одно действие можно никак 😃 Не устраивает, пишите свою функцию.

# Всё - объект, кроме необъектов

Заядлые питонисты любят хвалить его за красоту и логичность. Мол так классно, что в Python всё - объект. Вау! И правда классно, прямо всё?

Оказывается не совсем. Переменная примитивного типа - это ссылка. Получается в Python всё - объект, кроме того, что объектом не является. Какая-то несимметричная симметрия получается, когда всё объект, а переменная - нет 😃

# Несоответствие своей философии

"Должен существовать только один очевидный способ сделать что-то в Python” - гордо гласит нам дзен Python.

Тогда почему, например, по-своему очевидных способа форматирования вывода я насчитал как минимум три: c-style %, .format() и интерполяция в f-строках? А сортировочки с возможными sorted(a) и a.sort()?

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

# Субъективные причины

# Нижние подчеркивания

Здесь прямо даже не хочу ничего комментировать. Это как раз тот случай, когда хочется просто сказать: "Ребята, ну вы серьезно?". Чем больше я работаю с Python, тем больше я ненавижу андерскор.

# Дайте мне мой чертов цикл с постусловием

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

while True: ... if x break??? Ну такое себе ☹️

# Верните мне мой switch

Еще одна штука которой я нечасто пользуюсь, но привык думать, что она есть. Чем в конце концов вам мешал switch?

# Статическая типизация

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

# const? Не, не слышали

Ну и в конце концов, если вас правда беспокоит безопасность кода, то где мой чертов const?Я хочу иметь возможность назначить в своем коде константу так, чтобы при попытке далее поменять ее значение по ошибке я получал пощечину. Поймите меня правильно, я не мазохист, просто код бывает длинным и запутанным, а голова уставшей.

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

Да, описанный кейс - это скорее проблема плохого именования и области видимости. Но серьезно, если с инкапсуляцией на уровне соглашения джентльменов я уже как-то готов смириться, то без констант мне пока ещё грустно.

# Заключение

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

А что вы думаете о Python?

# Комментарии