По работе пришлось снова вернуться в Питон. Один чудак состряпал сервис на Кложе, но не осилил тесты и написал их на Питоне. Пока исправлял за ним, хлебнул тонны ненависти.

Во-первых, компилятор не обращает внимания на несуществующие переменные. Если допустить опечатку, то скрипт все равно запуститься, чтобы упасть на середине с ошибкой name "foo" is not defiened.

Я в курсе, что в Питоне сто способов подсунуть переменную в рантайм минуя обычное присваивание. Скажем, через globals:

>>> globals()["foo"] = 42
>>> foo + 1
43

Но за это отрывают руки, поэтому так все равно не делают. А кроме того, компилятор мог бы и ворнинг кинуть. Друг, ты используешь переменную accounts, а откуда она взялась я хз. Не хуйню ли ты пишешь часом? Я бы такой — ок, поправил. Но нет.

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

Питон замусорен лишними символами. Двоеточия, запятые — все это гнать поганой метлой. Сравним словари:

{
  "name": "John",
  "age": 42
}

и

{:name "John"
 :age 42}

Зачем двоеточие после ключа? В нем никакого смысла, все равно словари записывают по принципу пара на строку. Зачем запятые? Уберите их, ничего не изменится. Зачем строки на месте ключей? Строки — это сложный тип. Достаточно кейвордов или токенов. Это сущности, которые выражаются сами в себя. То же самое для списков и кортежей. Зачем там запятые?

Казалось бы, лаконичный синтаксис и бла-бла, а на деле мусор. Все, что можно убрать из языка, нужно убрать.

Кстати, о запятых. В Питоне на раз простреливаешь ногу последней запятой в кортеже. Если кортеж из одного элемента, запятая обязательна. Иначе такая запись вырождается в обычное значение а скобки игнорируются. Например, (1,) это кортеж, а (1) становится просто единичкой.

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

for user, email in (("ivan", "ivan@test.com"), ("john", "john@test.com")):

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

Самое смешное, что лет шесть назад я плотно кодил на Питоне и знал наизусть все эти грабли. Разбуди меня ночью, и я расскажу сто примеров, когда кажется одно, а выходит другое. Все это я держал в голове и ревностно спрашивал на собеседованиях. Проще говоря, подъебывал кандидатов и надрачивал ЧСВ. А теперь сам затерпел.

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

У коллеги банальная задача. Есть говносервис на Джаве с апишкой. Все параметры передаются через GET в строке запроса. Все ничего, но значения могут быть коллекциями, и нужно их схлопнуть в плоские ключи. Например, {:info {:user "Ivan"}} преобразовать в "info[0].user=Ivan".

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

Все, о чем я говорил — ошибки в дизайне языка. Мы не должны тащить на себе всю эту ересь. Питон был замечательным для своего времени. Сегодня я не представляю, как можно на нем писать, имея в распоряжении языки с неизменяемыми типами. Если существует другой язык с лучшим дизайном, надо использовать его. Пол Грэм сказал — не писать на самом мощном языке без уважительной причины значит совершить ошибку. А на чем писал Пол, вы и сами знаете.