Про анотації типів у Python
Колись Python був доволі вдало спроєктованою мовою, і я із задоволенням на ньому писав.
Потім, десь починаючи з Python 2.5, мова почала скурвлюватися.
Зрештою, я майже перестав її використовувати: змінився і характер розробок, і кращі альтернативи.
Але краєм ока я за ним спостерігаю і навіть, інколи, щось пописую.
Ось недавно у мене і стався маленький проєкт під Raspberry Pi і Python там виявився доцільним.
Заодно, я краєм ока глянув на анотацію типів.
І побачив шизофренію.
А тепер детально, що не так.
Python являється мовою з динамічною типізацією.
Якщо ви пишете скрипт чи користуєтесь техніками на кшталт DDD, то це в тему.
Але тут є і два основні недоліки: динаміка дорога в плані швидкодії і, що набагато гірше, неочевидна для програміста.
Поки це невеликий скрипт, це не є проблемою, програміст тримає в голові те, що він передає та хоче отримати, але вже на кількох тисячах рядків або командній роботі це починає давати збої, і потрібна інформація про типи як окремий випадок так званих “контрактів”.
Наприклад, “я передаю число й очікую, що мені повернуть нове число”.
Зазвичай контракти реалізуються на основі статичної типізації, коли вказується тип параметрів і значення, яке повертається.
Це я і спробував зробити у typed_twice().
У мовах типу Lisp, SmallTalk чи Erlang програміст працює з так званим о́бразом програми і його текстовий редактор бере звідти дані про типи, структуру, зміни в ній, тощо.
Оскільки Python є скриптовою мовою, він не створює такого о́бразу, а кожного разу читає, а потім виконує код програми.
Отже, йому нема звідки знати, які типи використовуються, тому залишається тільки статичний аналіз.
Але Python — мова з динамічною типізацією.
Так от, анотації типів і є спробою ввести статику, але не скасовувати динаміку.
Я спочатку подумав, що я чогось не розумію, тому звернувся до документації:
Це виявилося спробою всидіти на двох стільцях.
Тобто вони, в МІНОРНІЙ гілці, поламали сумісність(!) і свідомо пішли на порушення контракту просто заради того, щоб ДОПОМОГТИ ТЕКСТОВОМУ РЕДАКТОРУ!
Це те саме, що штовхати справну автівку, щоб їй було легше!
Казкові, просто казкові люди!
З іншої сторони, якщо ти розумієш необхідність статичної типізації, краще взяти щось статичне, наприклад, Java, C#, Go чи Swift, а не цю пародію на Java.
Тим більше, що у Java завезли приємне виведення типів.
А якщо дуже хочеться, то це все можна було зробити, не засмічуючи мову і не ламаючи сумісність на декораторах, десь так.
