LINUX.ORG.RU
ФорумTalks

Когда коту нечего делать - он добавляет проверку типов

 , , , pyrigth,


0

2

Понадобилось мне тут накидать небольшой CRUD, я по старой памяти рачехлил Flask,а заодно и решил донастроить neovim как Python IDE с помощью новомодных lsp/pyright/cmp. И тут же наступил ногами в жир:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

class User(db.Model):     ■ Expected type expression but received "type"
    id = db.Column(db.Integer, primary_key=True)

Гуглинг привел к issue к pyright, а оттуда и на подобную к mypy.

И вот что там пишет один бедолага:

I’m removing Flask-SQLAlchemy from my code entirely. I’ve moved most references of db.* to sa.* and sa.orm.* so I could get type checking. Next step: replacing db.Model with a custom base model, then db.session.

This has been a nightmare year with perfectly functional code falling apart every few months as various framework libraries refactor themselves to fit into the constraints of static typing.

Static type checking has been an excellent development for Python – it’s significantly reduced the need for test coverage of data types, or defensive code to evaluate function parameters – but it’s also shrunk the dynamic nature of Python to the subset recognised by type checkers. My project now has an average of five # type: ignore lines per Python file, and I’ve spent way too much time this year on (a) researching ways to make an idiom type-compatible, and (b) giving up and adding an ignore.

★★★★★

Да это уже было понятно и с внедрением TypeScript в ноду. Что есть плюсы и минусы. Толлько плюсы в монструозных корпорациях. А когда есть инди разработчик и он хочет быстро и просто - то всем на него плевать. А ведь для таких целей и создавались Python и JavaScript!

menangen ★★★★★
()

Static type checking has been an excellent development for Python

but it’s also shrunk the dynamic nature of Python

Yeah, сидели в говне – и нефиг было вылезать.

pr849
()

Для CRUD не проще ли взять Django, где они генерируются в несколько строк прямо из коробки?

Для Django есть стабы с типами, по моему опыту они работают. Django несколько раз заявлял, что они аннотации в проект добавлять не будут.

Если не устраивает Django, а с Flask такие проблемы, то можно попробовать более современный framework, который сразу был написан с поддержкой типов, скажем, FastAPI, нет?

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

Толлько плюсы в монструозных корпорациях. А когда есть инди разработчик и он хочет быстро и просто - то всем на него плевать. А ведь для таких целей и создавались Python и JavaScript!

В Python использовать типы необязательно.

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

Как и TypeScript

fixed. Нормальным людям вполне хватает js.

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

Мне нужен SQLAlchemy для SQL View. Django ORM их умеет разве?

К FastAPI пока не готов - не разобрался ещё с async в Python

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

А ведь для таких целей и создавались Python и JavaScript!

Пердон создавали шоп под Амёбу писать. Чисто исследовательская шняга, которую потащили грязными руками повсюду.

JS был сделан чтобы снежинки на страничках рисовать.

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

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

Вопрос – лучше ли. Если автор питона хорошо умел в т.ч. в статику, значит динамика была его сознательным выбором, и улучшатели – ламеры, пытающиеся прикрутить гоночный мотор к трёхколёсному велосипеду, чтобы юзать этот велосипед не по назначению.

pr849
()
Последнее исправление: pr849 (всего исправлений: 1)
Ответ на: комментарий от pr849

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

Использовать скриптовый недоязычок из помершей исследовательской ОС для веб-дерьма – вот это и правда ламерство. Ты бы ещё на баше писал.

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

Мне нужен SQLAlchemy для SQL View. Django ORM их умеет разве?

Да, через managed = False модели. Ну и если надо создавать, то надо будет вручную писать миграцию, не знаю, как с этим в алхимии.

К FastAPI пока не готов - не разобрался ещё с async в Python

FastAPI вроде и в синхронном режиме может работать. Пока у меня маловато опыта, но вьюшки точно могут быть синхронными.

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

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

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

К FastAPI пока не готов - не разобрался ещё с async в Python

И необязательно, тем более алхимия, как ORM - синхронная.

vvn_black ★★★★★
()

пирожки и камушки в «Static type checking has been an excellent development for Python»…на самом деле НЕТ.

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

Тут скорее к обычному велику прикручивают пару колёсиков сбоку для «безопасности». Сначала вроде как опционально, но проходит время, и вот тебе уже запрещают выезжать на дорогу без этих колёсиков.

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

TypeScript это другое. В стандарте вроде пока нет типоебского рака. И даже если появится, никто не мешает писать под ES5, например. В питоне же «стандарт» задаёт распоследняя версия интерпретатора, и если там сделают аннотации обязательными, то ты мгновенно вынужден будешь весь свой код аннотировать.

bread
()

flask_sqlalchemy — по некоторым причинам так себе библиотека. Ты наткнулся на ещё одну из них. Лучше взять чистый sqla.

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

Да, твоё сравнение и прикольнее, и точнее, :) учитывая, что от этих тайп-хинтов динамика статикой не становится – ни по скорости, ни по ещё там чему бы то ни было. А про «попытку прикрутить гоночный мотор к изначально примитивному трёхколёсному велосипеду» я вычитал ЕМНИП в начале 90-х в Компьютерре, и уже не помню про что была эта аналогия.

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

Хм, спасибо, попробую. А на нем только API можно стругать или обычные странички тоже можно?

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

Надёжность повышается, если всё правильно аннотировано и всюду автоматически проверяется.

Документируемость кода возрастает, становится проще и понятнее менять незнакомый/слабознакомый код, когда видишь типы. Свой код становится слабознакомым через 3-6 месяцев после того, как его написал.

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

что от этих тайп-хинтов динамика статикой не становится

Я подозреваю, что в одной из следующих версий что-нибудь запилят. Пока type hints как минимум облегчают чтение кода. Но, из-за лютой динамики некоторых библиотек, правильный type hint, бывает, невозможно сделать.

qaqa ★★
()
Последнее исправление: qaqa (всего исправлений: 1)
Ответ на: комментарий от emorozov

Ну это да. :) Иначе какой вообще был бы смысл.

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

Можно было вместо питона взять любой ЯП со статической типизацией. Причем, сделать это можно было хоть 30 лет назад ещё. И не грузить юзерам процессоры скриптотой. А сейчас уже поздно, ведь пока питонщики постигают радости аннотаций, в более других ЯП вовсю используется вывод типов, в т.ч. полный.

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

Не, ну 30 лет назад вывода типов ещё не было, поэтому пойнт в динамике в смысле компактности-скриптовости кода ещё был. Сейчас – уже да, связка статика + вывод типов + метапрограммирование динамику уделывает.

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

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

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

Понятия не имею, потому как амёбу никто не видел из ныне живущих за древностью.

Но язычок лучше от этого не становится.

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

Потому что так написано в статье про пердон:

The programming language Python was conceived in the late 1980s, and its implementation was started in December 1989 by Guido van Rossum at CWI in the Netherlands as a successor to ABC capable of exception handling and interfacing with the Amoeba operating system.

Кстати, если посмотришь на ABС, можешь увидеть очень много знакомого.

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

Тут скорее к обычному велику прикручивают пару колёсиков сбоку для «безопасности»

Ну как минимум после этого начинает более-менее вменяемо code completion работать. Но в целом типизация - это не просто «тут передаем int, здесь float, а на выходе получаем string». Это, в первую очередь, совершенно иной подход к разработке, который абсолютно не совместим с тем, что я вижу в питоновских либах, внутрь которых доводилось заглядывать.

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

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

Ну так типизация когда появилась, 7 лет назад, в Python 3.5. Тогда ещё не все на Python 3 перешли, плюс инерция мышления, плюс большинство существующих библиотек и фреймворков уже существовали тогда, плюс поначалу и типизация хромала, и инструменты вокруг неё.

Пройдёт еще 3-5-7 лет, и всё изменится в гораздо лучшую сторону.

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

Это, в первую очередь, совершенно иной подход к разработке,

+100500. Даже, я бы сказал, к архитектуре.

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

Ну как минимум после этого начинает более-менее вменяемо code completion работать.

Затратить кучу усилий на аннотации и урезать выразительность питона до уровня жабы ради комплишна. Это сильно. При том, что либы по большей части остались динамическими. Хотя тут я могу ошибаться, может переписали уже всё в угоду статическому анализатору. В любом случае непонятно зачем продолжают насиловать питон этот несчастный. Это язык для скриптов, глупо было вообще на нём что-то писать такое, что требует комплишна и типобезопасности.

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

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

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

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

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

Ты про бото и прочие говнолибы? Вот из-за них у питона репутация языка для одноразовых скриптов. Когда кто-то пишет либу полную рефлексии и global и потом удивляется почему многопоточный код стреляет себе в ногу в самых неожиданных местах - это не очень круто

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

Затратить кучу усилий на аннотации и урезать выразительность питона до уровня жабы ради комплишна.

Мне тоже не нравится многословность аннотаций, но они всё-таки не удлиняют код: как соответствовала строка на питоне нескольким строкам жабы, так и продолжает соответствовать.

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

По всей видимости, interfacing with Amoeba означает «надо было писать скрипты для Амеобы, а shell + awk было не удобно». Так что если интерпретатор был собран для Амеобы и поддерживал ввод/вывод в файлы, то это есть в любой ОС и любом шелле и интерпретируемом ЯП общего назначения. Т.е. Асеоба с т.з. самого ЯП тут как бы только релевантна, потому что Гвидо работал с Амеобой. А сожет быть и вообще питон никак не связан с Амеобой, а реализовался уже для Юникс.

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

Мне тоже не нравится многословность аннотаций, но они всё-таки не удлиняют код: как соответствовала строка на питоне нескольким строкам жабы, так и продолжает соответствовать.

ЭЭэ, нет. Как только увеличишь строки кода, всё поймёшь.

Roy-Batty
()
Ответ на: комментарий от Roy-Batty

лень беспокоить человека по пустякам

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

как соответствовала строка на питоне нескольким строкам жабы, так и продолжает соответствовать.

После лямбд уже не совсем так. forEach в строку в питоне нет (это не list comprehension, это не map), try-with-resources тоже пишется больше чем в 1 строку, ifPresent на optional в строку тоже через ж вызывается. Жаба сильно многословнее до 1.8, а вот потом уже не так однозначно. Какой-нибудь хитрый коллектор из списка в мапу бывает что на жабе выглядит куда короче и изящнее.

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

Но ведь это и есть предназначение питона.

Ну да, ну да. Знаешь сколько веб-продакшена крутится на питоне? Чуть побольше чем на «предназначенных для веба» рубях.

Назначение питона это гибкость и низкий time-to-market ценой производительности и качества кода. То есть ровно то чего хочет сейчас рынок

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

Но ведь это и есть предназначение питона.

Ну да, ну да. Знаешь сколько веб-продакшена крутится на питоне?

чтобы юзать этот велосипед не по назначению.

Назначение питона это гибкость и низкий time-to-market ценой производительности и качества кода. То есть ровно то чего хочет сейчас рынок

Может и так. Т.е. копроэкономика по-прежнему на марше.

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