balu: (Default)
[personal profile] balu
Колись Python був доволі вдало спроектованою мовою і я з задоволенням на ньому писав. Потім, десь починаючи з Python 2.5, мова почала скурвлюватися. Зрештою, я майже перестав її використовувати: змінився і характер розробок, і кращі альтернативи. Але краєм ока я за ним спостерігаю і навіть, інколи, щось пописую. Ось недавно у мене і стався маленький проект під Raspberry Pi і Python там виявився доцільним. Заодно, я краєм ока глянув на анотацію типів. І побачив шизофренію:

def ordinary_twice(p):
    print(p*2)

def typed_twice(p: int) -> int:
    """Я передаю число і очікую число"""
    print(p*2)

ordinary_twice(2)
4
ordinary_twice("2")
22                   # Нормальна поведінка
typed_twice(2)       # Тут теж
4
typed_twice("2")     # А тут повинно волати, що я неправий 
22                   # але поведінка не змінюється!

А тепер детально, що не так.
Python являється мовою з динамічною типізацією. Якщо ви пишете скрипт, чи користуєтесь техніками на кшталт DDD, то це в тему. Але тут є і два основні недоліки: динаміка дорога в плані швидкодії і, що набагато гірше, неочевидна для програміста. Поки це невеликий скрипт, це не є проблемою, програміст тримає в голові те, що він передає та хоче отримати, але вже на кількох тисячах рядків або командній роботі це починає давати збої і потрібна інформація про типи, як окремий випадок так званих "контрактів". Наприклад, "я передаю число і очікую, що мені повернуть нове число". Зазвичай, контракти реалізуються на основі статичної типізації, коли вказується тип параметрів і значення, що повертається. Це я і спробував зробити у typed_twice(). У мовах типу Lisp, SmallTalk чи Erlang програміст працює з так званим "образом програми" і його текстовий редактор бере звідти дані про типи, структуру програми, зміни в ній і т.і. Оскільки Python є скриптовою мовою, він не створює такого "образа", а кожного разу читає, а потім виконує код програми. Отже, йому нема звідки знати, які типи використовуються, тому залишається тільки статичний аналіз. Але Python мова з динамічною типізацією. Так от, анотації типів і є спробою ввести статику, але не скасовувати динаміку. Я спочатку подумав, що я чогось не розумію, тому звернувся до документації:

This PEP aims to provide a standard syntax for type annotations, opening up Python code to easier static analysis and refactoring, potential runtime type checking, and (perhaps, in some contexts) code generation utilizing type information.

Of these goals, static analysis is the most important. This includes support for off-line type checkers such as mypy, as well as providing a standard notation that can be used by IDEs for code completion and refactoring.
...
It should also be emphasized that Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention.


Це виявилося спробою всидіти на двох стільцях. Тобто вони, в МІНОРНІЙ гілці, поламали сумісність! і свідомо пішли на порушення контракту просто заради того, щоб ДОПОМОГТИ ТЕКСТОВОМУ РЕДАКТОРУ! Це те саме, що штовхати справну автівку, щоб їй було легше! Казкові, просто казкові люди!
З іншої сторони, якщо ти розумієш необхідність статичної типізації, краще взяти щось статичне, наприклад Java, C#, Go lang чи Swift, а не цю пародію на Java. Тим більше, що у Java завезли приємне виведення типів.
А якщо дуже хочеться, то це все можна було зробити, не засмічуючи мову, і не ламаючи сумісність на декораторах, десь так:
@Input(int)
@Return(int)
def ordinary_twice(p):
    print(p * 2)

З цього приводу у мене все.

Date: 2020-05-20 05:42 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Я думаю, было бы неплохо, если б питонщики изучили джаваскрипт (the good parts). Но тогда они перестали бы быть питонщиками.

Profile

balu: (Default)
от. Михайло

December 2025

S M T W T F S
 123 456
7 8910111213
14151617181920
21222324252627
28293031   

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 2nd, 2026 03:12 pm
Powered by Dreamwidth Studios