Как стать автором
Обновить

Комментарии 16

Сначала создали язык, где за счёт очень вольной трактовки типов и двух тонн синтаксического сахара можно кодить очень быстро. Теперь это всё уже застыло в камне, и поверх этого начинают добавлять отсутствие — да, именно добавлять отсутствие вольностей, чтобы получить скорость. Получается фигня.
Во-первых, ни о какой скорости речи не идёт, это не те аннотации, которые в numba. Во-вторых, добавлять опциональное отсутствие, раз уж на то пошло.
Да тут вообще непонятно о чем именно речь идет: чем больше вдумываешься, тем менее очевидно. Питон сделали именно как компактный с наглядным легко читаемым синтаксисом (скоуп видимости через очень спорное форматирование отступами ради наглядности).
Вообще почти все решения продвигались создателем языка именно ради простоты и наглядности. За что он и был с успехом воспринят как в академ среде, так и в смежных отраслях, двигающих софтовую часть IT.
А теперь выясняется, что все нужно бросить и начать переживать: «как там бедные статические анализаторы? Не тратят ли лишние такты CPU?»

После прочтения статьи остро вспомнились последние стандарты плюсов — из лаконичного языка он превратился в что-то трудно удержимое в голове без справочника под рукой.
Речь о том (по крайней мере, для меня), что, начиная с версии 2.6, в Python появилась возможность ассоциировать с любой переменной или возвращаемым значением функции некий кусочек метаданных. Всё остальное отдано на усмотрение пользователей языка. Модуль typing — это просто пример того, как эти метаданные могут быть использованы.

Далеко не все используют аннотации, многие про них и не слышали. Для таких людей Python в плане синтаксиса, каким был таким и остался.

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

Питон остался всё таким же компактным.

Однако сильно упростился для написания кода, когда тебе не нужно проверять что именно возвращает та или иная функция, или делать всякие шаманские телодвижения чтобы ИДЕ показала подсказки типизации.

При чем тут «бедные статические анализаторы»? Глазами читать типизированный код сильно проще.
Как же не идёт, когда сам Гвидо пилит mypy в комплекте с mypyc который как раз опираясь на статическую типизацию компилирует код на питоне, с уточнением структур и типов, в код на си. Например инт-объект превращается в инт на си, занимает меньше памяти и работает быстрее. На их собственных бенчмарках производительно вырастает почти в 10 раз, на моих личных тестах всего в 5, что тоже неплохо.
НЛО прилетело и опубликовало эту надпись здесь
Именно. Выше писал в надежде, что читающий меня понимает, что скриптовые языки с наглядным синтаксисом выбирают прежде всего для скорости (и как одно из следствий — качества) кодинга, а никак не для того, чтоб «выжать воду из камня». Если нужно чтоб ПО работало в 10 раз быстрее — тут либо начинать разбираться как твой конкретный компилятор языка работает, кидая в топку дестикратые человеко-часы, либо все же выбрать другой язык/среду разработки и написать эту часть на нем.
В жизни, конечно, все будет зависеть от технической грамотности и дальновидности архитектора проекта, но в идеальном вакууме как-то так.

Да, всё так. Потому что, Гвидо делал язык, чтоб быстро скрипты до 100-и строчек на коленке делать, а потом на нём зачем-то стали ваять всякие фреймворки и приложения с десятками участников и тысячами строк кода. В таких приложениях, конечно нужна типизация. И, конечно, важна производительность. Пока старый синтаксис не запретили, можно ещё пользоваться. Потом придётся переходить на Lua.

Все же для меня ситация «Беру в языке то что мне нужно и пишу хороший код» — это, так скажем, первый уровень.
Второй уровень — это способность читать чужой код на этом же языке без эмоций: «А это что за странный синтаксис?! Никогда такого не видел!». Если стандартом языка что-то утверждено, то знать и понимать нужно все из этого стандарта, а не только интересную сейчас его половину.

P.S. Сорри, комментарий был к ответу выше

Поправьте, если я не прав, но PEP 563 работает начиная с Python3.7, который вышел больше 4 лет назад (надо было только написать from __future__ import annotations). У меня есть проект, решающий похожие на pydantic задачи и в нем не было проблем связанных с этим PEP. Есть подозрение, что проблемы Pyndatic связаны не с питоном, а c принятыми ими неверными решениями.

Аннотации типов можно использовать для двух вещей, связанных с классами, хранящими данные. Во-первых, это валидация кода - что переданные данные соответствуют задекларированным типам полей (проверка типов). Во-вторых, это преобразование примитивных структур данных с датакласс (парсинг). Первая задача решается статическими анализаторами, такими как mypy или pyright. Вторая задача в общем случае должна решаться отдельным слоем кода (вспоминаем single responsibility, разделение DTO и view-слоя и т.п.).

Разработчики pydantic почему-то решили, что задачу парсинга данных должен решать тот же класс, что и хранит их. Из этого следуют следуют такие ограничения как: невозможность использовать для хранения данных стандартные датаклассы, невозможность иметь нескольких вариантов парсинга в одну структуру и, самое главное в рамках текущей статьи, необходимость иметь полную информацию об аннотациях на момент конструирования класса.

Сначала пишешь
from __future__ import
потом __future__ заменяешь на annotation, потом добавляешь кавычки к необязательной типизации (которую, возможно даже не ты в код вставил, и не для своих нужд), потом хоп и новый вроде бы необязательный к применению PEP… Все это приводит к тому, что при апгрейде даже минорной версии начинаешь думать: «лишь бы сейчас все работало как и год назад».
Код, написанный в Jupyter (pandas и т.д.) ~1.5 года назад уже дважды правился после минорных pip install --upgrade

Тут двоякая ситуация, с одной стороны сам разработчик PEP 563 признал, что typing.get_type_hints плохо работает для не глобальных пространств имен (основаная претензия Pydantic).

С другой стороны, многие библиотеки уже адаптированы под PEP 563, и говорить им, что он отменяется, переходите на PEP 649, тоже не рабочий вариант.

Думаю проще Pydantic подстроиться под Python, а не Python подстраиваться под библиотеку.

def simplify_python():
  remove_types()
  
def complicate_python():
  add_types()
  
while 1:
  simplify_python()
  while 1:
    complicate_python()
    if python_looks_like_cpp(): break
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации