LINUX.ORG.RU

Зачем нужна статическая типизация?, или Вы всё врете!

 ,


1

4

В теме "Питонячьи радости " на последних страницах между мной и @rtxtxtrx внезапно разгорелся спор, из которого я понял, что есть еще люди, которые не считают динамическую типизацию (в том виде, в котором она представлена в Питоне, а именно строгая динамическая типизация) серьезным недостатком при работе с большим объемом кода, особенно при рефакторинге. Вообще изначально разговор завязался вокруг назначения type hints введенных в Питон 3: я утверждал, что они нужны для создания семантических связей в коде, которые будут препятствовать внесению деструктивных изменений в код в результате опечатки или иной ошибки кодера (изменил код, в результате которого какое-либо выражение получило некорректное значение, которое тем не менее обладает схожим с корректным значением типовым контрактом, поэтому при запуске код не «упадет» сразу, указав на проблему); оппонент заявил, что они нужны для (само)документации и не более того.
Но потом выяснилось, что и царь-то ненастоящий (читай, статическая типизация). Не нужна она, просто именуй сущности понятно и уповай на строгую типизацию. А если типизация не строгая, то сами виноваты, у нас в Питоне всё ОК.
Поскольку тема большая и вкусная, я предлагаю всем обсудить этот очень важный вопрос в меру скромных сил и познаний каждого желающего. Обсуждение вторичных вопросов, как-то «статическая типизация нужна для генерации эффективного кода», «при динамической типизации тип только один, object» etc. не предусмотрено — спорим только о том, дает ли статическая типизация выигрыш, если надо перекраивать несметные тыщи kloc. Если есть вообще о чем спорить 😅.

★★★★★
Ответ на: комментарий от monk

Это не к надёжности, а к документируемости

Мухи от котлет следует отделять. Если нужна документируемость, просто пишите комменты.

seiken ★★★★★
()
Ответ на: комментарий от seiken

Комменты не видны при рефлексии. Ну то есть их можно достать, но это гемор. А вот докстринги это самое оно, туды можно всякого положить (включая типы аргументов) и потом автоматом юзать например. И ненужны все эти хинты…

AntonI ★★★★★
()
Ответ на: комментарий от monk

Я ХЗ, я его не пробовал. Но если есть решения которые такое умеют - почему оно не в основной ветке? Это же нынче ИМНО проблема No1.

AntonI ★★★★★
()
Ответ на: комментарий от monk

Анало-лизатор тебе не проверит соответствует ли строка регулярке, например, имя хоста. Там не только айпи может быть, но и домен с латинскими, любыми символами юникода или, закодированный пуникодами, а ты почему-то уверен, что там всегда айпи, который можно конвертировать в число. Только придурки будут имя хоста проверять, писать портянки бреда, потому как объять необъятное невозможно. Пускай падает!!! Тож самое с email указанным при регистрации, ты можешь его формально проверить на на наличие собаки «@» в строке и все, если юзверь ввел невалидный email, то ему просто не придет письмо об активации аккаунта. Проблемы очень надуманные, а желание все контролировать - это симптом… Но про это я расписывать не буду. Я уже писал тут портянку про то что среди вайтишников одни шизы

rtxtxtrx ★★
()
Ответ на: комментарий от AntonI

Это же нынче ИМНО проблема No1.

Вот те, для кого это проблема No1, и разработали mypy. Для разработчиков питона это вообще не проблема.

monk ★★★★★
()
Ответ на: комментарий от AntonI

Потому что токенайзер пропускает пробелы и комменты, их в построенном дереве нет, а докстринги - это просто строки и все, не какой-то там особый тип.

rtxtxtrx ★★
()
Ответ на: комментарий от rtxtxtrx

Спасибо Кэп! Продолжайте наблюдение.

AntonI ★★★★★
()
Ответ на: комментарий от monk

Вообще то это проблема для всех кто пишет на питоне что то толстое - мб не все это просто осознают. Даже я в скриптах из 600 строк на такое налетаю.

Спасибо за наводку, не знал, почитаю!

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Ого человек которому не нужон дебагер, решил тайпчекер прикрутить. Я выше писал, что в vscode помимо дебагера еще тайпчекер врубить можно, он тебе подсветит ошибку, если ты повинуясь какому-то наваждению решишь носорога с бульдогом скрестить

rtxtxtrx ★★
()
Ответ на: комментарий от Forum0888

По секрету, о чем тема, не имеет никакого значения — я уже на первой странице увидел, что она превратится в собрание заблуждений на заданную тему и около. При этом себя я не исключаю из «заблуждающихся», отнюдь 😊.

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от rtxtxtrx

Ого человек которому не нужон дебагер

Дебаггер действительно менее нужен, чем проверка типов.

Сильную потребность в дебаггере испытывают в основном джуны.

wandrien ★★
()
Ответ на: комментарий от Virtuos86

Тред интересный - «это +», но не по теме - «а это -» (как говорил Дартаньян).

В целом - позитивный тред.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 5)
Ответ на: комментарий от rtxtxtrx
  1. это какие? datetime? Decimal? почему именно скалярные? Где доказательства в коде?
  2. Откуда ты это узнал? Как это очевидно из кода метода, покажи на источник очевидности
  3. Ок, тут согласен по методу выше можно понять. Но тебе все равно надо лезть в другой метод
  4. можно указать если бы да кабы. Там ничего не указано. Ты не ответил на мой вопрос.
  5. можно через тайп-хинты указать не вижу никаких тайп-хинтов по ссылке в коде. И ты опять ушел от ответа
Aswed ★★★★★
()
Ответ на: комментарий от wandrien

В питоне есть потокобезопасные операции. Это нужно смотреть сколько опкодов выполняется и есть ли блокировка внутри… Но я в целом не понимаю какие у тебя там проблемы возникают, потому что любая вебня кроме асинхронной - это многопоток. Почитай про всякие переменные, привязанные к контексту. Типа всяких request ао фласке, который ты импортируешь глобвльно, но там всегда разное будет лежать. И тд и тп

rtxtxtrx ★★
()
Ответ на: комментарий от rtxtxtrx

Любая вебня многопоток и миллионы людей сидят джангу в дебагере отлаживают, не зная что это «невозможно»

rtxtxtrx ★★
()
Ответ на: комментарий от dimgel

По тому воинствующему фанатику я не спорю, но @monk адекватен. А если тебе его взгляды на какие-то вопросы не нравятся, это нормально же. Он, к слову, за Racket ратует, а там со статической типизацией всё более чем хорошо (Typed Racket), то есть он не безальтернативный «фоннат» динамики, как некоторые, а понимает плюсы и минусы разных подходов.

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от Aswed

Все это нубо вопросы. А про json там в докстринге написано, что во что конвертируется. А с датами чисто логически можно допереть, что их непонятно как сериализовать: какой формат ты хочешь? Iso?? - А их несколько, а нужна ли там временная зона? А нужна ли точность вплоть до микросекунд? Да и вообще нужна ли тебе строка или хватит timestamp? А timestamp тебе в секундах или миллисекундах? Если ты хочешь объекты сериализовать, то для этого используется другой формат, который используется и при межпроцессном взаимодействии передаваясь через пайпы - pickle

rtxtxtrx ★★
()
Ответ на: комментарий от wandrien

А по-твоему на питоне что-то кроме пишут? Даже джава с сисярпом и go в это скатились. Кубики не в счет как и применение питона в качестве скриптового языка в играх и каком-нибудь блендере

rtxtxtrx ★★
()
Ответ на: комментарий от ugoday

Да не точно так же, а упадет до того как ты свой код вообще закоммитишь, потому что линтер не даст. Разумеешь разницу?

FishHook
()
Ответ на: комментарий от rtxtxtrx

А по-твоему на питоне что-то кроме пишут? Даже джава с сисярпом и go в это скатились. Кубики не в счет как и применение питона в качестве скриптового языка в играх и каком-нибудь блендере

я пару лет работал над World of Tanks, приходилось колупать проект на примерно миллиона полтора строк питонячьего кода без тайп-хинтов. Я чуть не спился тогда. Хотите писать код на питоне и сохранить психическое здоровье, не экономьте на типизации

FishHook
()
Ответ на: комментарий от FishHook

У вас профдеформация просто. Для вас, по крайней мере это первое, что приходит в вашу голову, корректность адреса определяется просто: четыре октета хорошо, шесть — плохо. А вот, для меня, например, ситуация выглядит совсем иначе, опасность не в том, что количество октетов не совпадёт, а «назначил публичный адрес для production DB — иди пиши заявление по собственному желанию». Такие дела.

ugoday ★★★★★
()
Ответ на: комментарий от rtxtxtrx

Ну это конечно классно, что тебе вопросы мои не нравятся, но ответить на них ты так и не смог. А вот была бы статическая строгая типизация, таких бы вопросов не возникало. Возможно были бы другие, но эти - нет.

Aswed ★★★★★
()
Ответ на: комментарий от ugoday

Я не понимаю о чем вы. Для вас, для нас, какая разница. Мы обсуждаем опциональную статическую типизацию в питоне. Вы можете что угодно делать со своим кодом, это ваше право. Статическая типизация призвана решить несколько проблем, в частности:

  1. Уменьшить количество логических ошибок
  2. Улучшить читаемость кода
  3. Предоставить информацию о типах в рантайме для дальнейшего использования в библиотеках вроде pydantic, attrs etc

Если вам лично ничего из вышеперечисленного не инетересно, ну бога ради, никто вам и не навязывает - не используйте. В чем проблема то?

FishHook
()
Ответ на: комментарий от Virtuos86

На больших проектах динамика сосёт со свистом, о чём ты сам же и написал в ОП. А поделки вась пупкиных обсуждать бессмысленно.

dimgel ★★★★★
()
Ответ на: комментарий от FishHook

Все перечисленное и решается аннотациями. В языках типа питоне статическая типизация вообще невозможна.

Да в typescript она тоже соплями приклеена:

let o = { 
    valueOf() {
        return 42
    }
}
o + 1 // 43
rtxtxtrx ★★
()
Ответ на: комментарий от rtxtxtrx

тайп-хинты, аннотации, опциональная статическая типизация - это всё одно и то же. Можно, конечно, доебаться до определения, но мы все понимаем о чем речь в топике

FishHook
()
Ответ на: комментарий от rtxtxtrx

Я просто перечислю однотипный бред, которы не считаю нужным опровергать, что тут пишут различного рода диванные эксперты:

  • На Python есть проекты, содержащие миллионы строк (без учета внешних либ). За списком в Google.
  • Дебагер прекрасно работает с многопоточным и многопроцессным кодом.
  • У скриптопейсателей не возникает проблем из-за динамической типизации. В питоне утинная типизация. При попытке конкатенировать строку с числом произойдет ошибка. Это отличие от js/php.
  • Аннотации используют только для IDE. Все. mypy мало кому нужен. Его пиарят, пиарят, а кроме пафосных псевдоинтеллектуалов никто не использует. В этом можно убедиться, сравнив количество под любым видео о сабже.
rtxtxtrx ★★
()
Ответ на: комментарий от rtxtxtrx

Ответ на: комментарий от rtxtxtrx 20.11.23 15:00:37 CET количество просмотров, ес-но rtxtxtrx (20.11.23 15:02:08 CET)

вы с кем вообще общаетесь?

FishHook
()
Ответ на: комментарий от rtxtxtrx

Ну вот ты значит умеешь готовить по твоим заявлениям. Почему тогда не ответил на мои вопросы, которые сам назвал нубскими?

Aswed ★★★★★
()
Ответ на: комментарий от FishHook

Я не понимаю о чем вы.

О том, что статическая типизация путается под ногами и мешает жить, при этом пасует, сталкиваясь с проблемами реального мира.

ugoday ★★★★★
()
Ответ на: комментарий от rtxtxtrx

Я ответил на 5 вопросов НЕ ПО ТЕМЕ

Ты действительно не по теме ответил на пять моих вопросов по теме о проблемах динамической типизации. Я тебе указываю на сложность разработки и отладки из-за того, что из кода(без документации) вообще неочевидно какими могут и должны быть те или иные значения в аргументах методов в СТАНДАРТНОЙ БИБЛИОТЕКЕ. Ты же уходишь от ответов

1. ссылаешься на документацию а не доказательсва в коде(естессно их же там нет)
2. тайпхинты как раз и нужны чтобы это указать(нужны конечно, но их там нет. Или ты предлагаешь мне стандартную библиотеку размечать?)
4. тоже через тайпхинты класс можно указать...(можно но не указано)
5. Random тоже явно никто никогда не вызывает(спасибо, что указал мне что я не могу использовать публичный метод публичного класса в стандантной библиотеке, потому что ты так сказал)

Остальное можно при желании додумать

Помимо вышеперечисленного ты используешь

  • Подмена тезисов: Решение простое: не делай X, раз не умеешь готовить
  • Апелляция к авторитету вместо аргументов: Я с сишки учиться программировать начинал. ВНЕЗАПНО!
  • Прямое оскорбление: Все это нубо вопросы

Тут и додумывать ничего не надо. Ты пытаешься спрятать свою некомпетентность за демагогией.

Aswed ★★★★★
()
Ответ на: комментарий от ugoday

О том, что статическая типизация путается под ногами и мешает жить, при этом пасует, сталкиваясь с проблемами реального мира.

Это говорит лишь о том, что вы в своей практике с проблемами реального мира не сталкивались. Можете дать ссылку на какю-нибудь из своих работ?

FishHook
()

типизации друг от друга отличаются поведением программы.

  1. нестрогая динамическая падает с segfault.

  2. строгая динамическая падает с любовно оформленным сообщением (поскольку, это самое частое место куда будет попадать программист в языке) и дампом стека.

  3. строго статически типизированная вообще падать не будет.

alysnix ★★★
()
Ответ на: комментарий от alysnix

строго статически типизированная вообще падать не будет.

С чего это? Статическая типизация не обязывает ловить все исключения.

monk ★★★★★
()
Ответ на: комментарий от alysnix

Смешно. Количество показов стеков от Java и JavaScript примерно одинаково.

monk ★★★★★
()
Ответ на: комментарий от FishHook

Профдеформация, как и было сказано. Подсказка: «IDE не дополняет дополнения» — это не проблема реального мира.

Можете дать ссылку на какю-нибудь из своих работ?

Единственное, что я делал в opensource (и что не лежит по закрытым корпоративным репозиториям) это компоненты для OpenStack, но там под реальным именем, которое я где попало предпочитаю не разглашать.

ugoday ★★★★★
()

строгая типизация превращает программирование в скучную рутину, в обычное ремесло.

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

если ты молод и полон сил, выбирай динамические языка программирования!

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)