Comments 11
А потом ты пытаешься типизировать код, использующий numpy, и попадаешь в ад, где чуть ли не каждое второе выражение приходится заворачивать в typing.cast().
В numpy есть свой numpy.typing.
Не особо помогает. Система типов не может понять, что если x: ndarray[[int, int], float32], то x[0] будет ndarray[[int], float32]. И я её не особо виню, учитывая сколько вариантов адресации есть у массивов в numpy. А уж про массивы, одно из измерений которых имеет фиксированный размер, и говорить нечего. Тут типы - это просто документация в коде, и не более...
type Point = tuple[float, float]type RouteMap = dict[str, list[Point]]
Не очень понятно, зачем тут алиасы, если надежнее сделать любой DTO
Теперь, чтобы передать туда объект, он обязан наследоваться от
Closable
Не обязан, тайпхинты всё еще не проверяются в рантайме.
Parsing, not validation: Pydantic не просто говорит «плохо/хорошо». Он занимается парсингом
Проблема пидантика в том, что никто его это не просил делать: на официальном сайте написано "Pydantic is the most widely used data validation library for Python", но по факту он и валидирует, и типы приводит, когда хочет.
Алиасы это не обязательство, это просто надпись на заборе, а на заборе, как известно, много чего написано. И если ты напишешь ... -> float, а в самой функции напишешь return "", то об этом в большинстве случаев ты узнаешь только в рантайме. Ну и ещё есть куча популярных библиотек, которые клали огромный питон на эти ваши типы
вопрос - зачем, если есть изначально типизированные языки? Просто возьми любой из них.
Имею опыт с беком на питоне (джанга), все пытаюсь его типизировать, но это все еще очень костыльная система.
А потом берешься за фронт на typescript/rust и кайфуешь. Ну, хотя бы open/async api кодогенерация с бека есть, и то хорошо.
А потом кто то узнал что программа на с++ стала более читаемой, выполняется на два порядка быстрее. И пишется тем же клодом по тому же промпту.
Всё что последний год происходит с питоном - типы, потоки, - это попытки устранить его ранее заявленные достоинства - простоту и читаемость.
Поспорю. Читаемость кода с прописанными типами куда выше. В противном случае будешь постоянно играть в увлекательную игру "угадай класс возвращённого объекта по методам, которые вызываются на этом объекте в существующем коде". Просто нужно это использовать без фанатизма: параметры, возвращаемые значения, и локальные переменные содержащие нетривиальные (более двух уровней) структуры данных. Этого вполне хватит. Причём в последнем случае действительно иногда лучше описать промежуточный датакласс-другой.


Погружение в typing: Как сделать Python почти типизированным