Питон и ненависть
По работе пришлось снова вернуться в Питон. Один чудак состряпал сервис на Кложе, но не осилил тесты и написал их на Питоне. Пока исправлял за ним, хлебнул тонны ненависти.
Во-первых, компилятор не обращает внимания на несуществующие переменные. Если
допустить опечатку, то скрипт все равно запуститься, чтобы упасть на середине с
ошибкой 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"
.
Коллега родил код на полтора экрана. Три вложенных оператора, шестерной отступ от левого края. Одну и ту же переменную переписывает три раза. Как это говно поддерживать — без понятия. Сюда даже новое условие не добавишь, потому что переменные перетираются, и все перепроверять. А на неизменяемых коллекциях двадцать строчек и бесконечная расширяемость.
Все, о чем я говорил — ошибки в дизайне языка. Мы не должны тащить на себе всю эту ересь. Питон был замечательным для своего времени. Сегодня я не представляю, как можно на нем писать, имея в распоряжении языки с неизменяемыми типами. Если существует другой язык с лучшим дизайном, надо использовать его. Пол Грэм сказал — не писать на самом мощном языке без уважительной причины значит совершить ошибку. А на чем писал Пол, вы и сами знаете.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter
Гена Петров, 25th May 2019, link
Проблема не в пайтоне, а в тебе на самом деле.
Я глянул твое резюме, ты функциональщик, судя по кложу, и пытаешься натягивать оопешную сову на лисповский глобус. Поэтому и вопросы к хэшам, и в косяках пайтона ты не заметил самый главный его недостаток (да-да, я про очередность запуска модулей и их взаимодействие внутри проекта).
Неверное использование пайтона я встречаю относительно регулярно - например, в любых курсах по дизайн паттернам для пайтона, где используют геттеры и сеттеры (ничего, что это не пайтоник-вей вообще?; да и вообще они натянуты из си++ в пайтон).
Решение простое - оставьте этот язык оопешникам, которые не в ладах с математикой, и которые никогда не будут заниматься функционалкой.
ЗЫ - джава мертва. не знаю, кто ее вообще использует, весь мир пишет на котлине.
Виктор Тыщенко, 9th Jun 2019, link
Простите, из вашего python торчат уши scala. Не надо лезть со своим уставом в чужой монастырь. У каждого языка есть своя парадигма, в том числе и у python. Код scala для питониста тоже будет тот ещё треш и угар.
Что касается, необъявленных переменных, то разве вы код в блокноте пишете? Это же касается и тьюплов, и globals. Что же касается словарей - объявите Enum, если так хочется. А на самом деле ключом может быть всё, что реализует пару магических методов __hash__ и __eq__. Ну и по формату словаря - он довольно стандартен и похож на всем привычный json.