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