LINUX.ORG.RU

Объектная модель питона

 , ,


2

4

- Сколько нужно архитекторов, чтобы создать язык программирования?
- Сто. Один будет писать язык, а 99 - говорить, что могут сделать лучше.

Так скажем, я решил вспомнить обсуждение по теме треда: Generics в Python или помогите победить mypy

Да, наркоманский питон захватывает мир, и с этим нужно что-то делать. Нет, я не намерен делать питон 4 - я вижу свет в конце тоннеля в рамках третьей версии. Но мне нужна ваша помощь: какие фундаментальные фичи, по-вашему, в питоне вообще не нужны, а какие - должны быть переработаны?

Прежде всего, я хотел бы вспомнить про RPython ( https://rpython.readthedocs.io/en/latest/rpython.html ).
Смысл особенностей языка прост - поддержка вывода типов. В частности, из языка убраны динамические определения классов и функций, динамическая типизация переменных, глобальные переменные стали константами, функции-генераторы транслируются в классы-итераторы и потеряли большую часть своих фич. У RPython есть большой минус - эти его ограничения сильно раздувают код, затрудняют писание и читание.
Итак, мои соображения:

1. Множественное наследование. Его нет даже на уровне C-функций в реализации питона и API расширений. «Но как же интерфейсы?» - возразите вы. Интерфейсы в C++ и Java нужны в роли объявления протоколов вызова методов объекта с целью последующей статической проверки этих протоколов при компиляции, а также для формирования таблиц методов, которые можно использовать независимо от объекта во время выполнения. Эти роли полностью потеряны в питоне, потому нет никакого оправдания их существованию. Мне нравится то, как сделаны интерфейсы в Go - это очень похоже на питоновые ABC: https://www.python.org/dev/peps/pep-3119

2. Генераторы - зло. Это прямо-таки запущенный случай GoTo, когда выполнение не просто бесконтрольно прыгает по коду - оно прыгает по стэкам. Особенно лютая дичь происходит, когда генераторы пересекаются с менеджерами контекста (привет PEP 567). В треде, скорее всего, опишу веселости реализации генераторов в PyPy/RPython. В питоне есть общая тенденция запутывать приложение в тесный клубок связанных изменяемых состояний, что не дает возможности параллелить и оптимизировать выполнение программы, а генераторы - вишенка на этом торте.

3. Изменение классов для существующих экземпляров объектов. Не, я понимаю, что класс в питоне объявляется во время выполнения. Но, блин, зачем в него совать изменяемые переменные? Зачем в старые объекты добавлять новые методы? Причем, попрошу обратить внимание на то, как нужно нагибаться раком для того, чтобы добавить аналогичные методы в сам объект, а не в класс - для этого нужны types.MethodType, function.__get__, functools.partial, и так далее. Методы в питоне вообще понадобились по простой причине - гвидо не придумал других способов сделать короткие имена функций (чтобы не было gtk_button_set_focus_on_click), поскольку не ясно, как выбирать из кучи похожих функций с коротким именем нужную под этот конкретный объект. Так в питоне появились len, iter, next, isinstance, slice, dict, dir, str, repr, hash, type - сейчас это обертки над соответствующими методами классов с подчеркиваниями в имени, а когда-то встроенные простые типы не являлись классами и работали только через эти функции. Так-то, я не вижу особой разницы между записью method(object) и object.method - особенно если method является статичной функцией, которой, в общем-то, все равно, какой первый аргумент (self) принимать.

Вот. Прошу дополнять. Да, я знаю, что у питона основные проблемы две: отсутствие статической типизации и многопоточности - но это черезчур абстрактные требования. К тому же, Javascript безо всяких типизаций достиг производительности Java, при том, что жавамакакам постоянно приходится гнуться под язык, а JS-кодеры испытывают удовольствие от говнокодинга.

★★★★

Тему не читал, но питон осуждаю. Язык без статической типизации не имеет права на существование. Все, кто таковой язык использует или, тем более, продвигает и развивает, — заражены мозговыми слизнями.

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

Да ты вообще сообразительностью не отличаешься…

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

неясно, каким образом это помогает хоть сколько-нибудь уменьшить тестовое покрытие без потери качества продукта. Фанатики, пытающиеся протестировать каждый оператор быстро(или не очень) обламываются и прекращают тестировать сущности меньше чем функция строк на 5-10. Статическая типизация здесь только в скорости обнаружения проблем выигрывает

Статическая типизация никак не помогает искать проблемы в логике. Статическая типизация помогает искать проблемы опечаток, проблемы некорректного присвоения переменных, приведения типов. Уже давно прошло то время, когда программисты по десять раз перечитывали программу перед тем, как скормить ее компилятору. Если программист понимает, как у него работает логика, то очень редко проблемы с логикой будут проходить в релиз. Динамика же переносит проблемы опечаток, присвоения, приведения в разряд «проблемы в логике», и уносят их в тестирование или релиз. Ситуация становится тем хуже, чем больше проект и чем более неуловимой становится ошибка логики, вызванная неправильным типом.

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

Ну да ладно, видимо ты о чём-то своём

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

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

Неудивительно, что сейчас определённую популярность набирает PureScript — переписать часть логики приложения с уверенностью, что там не будет сюрпризов из-за того, что ты что-то там недоглядел или упустил, довольно сильно привлекает людей

Если они с Elm наперегонки будут «набирать популярность», отжимая друг у друга ЦА, то так о них никто и не узнает.

byko3y ★★★★
() автор топика

Изменение классов для существующих экземпляров объектов. Не, я понимаю, что класс в питоне объявляется во время выполнения. Но, блин, зачем в него совать изменяемые переменные?

Интересное суждение.
Чем?
В некоторых участков кода скриптовых языков используются переменные, которые
в run time могут принимать значения разного типа.
Понятно, что в этом случае код работает медленнее, чем с «типизированной» переменной.
Так вот программисты частенько смотрят на это «сквозь пальцы» и как результат программа работает медленнее.

Вот вопрос?
В интерпретаторах хоть где-то при парсинге и формирования байт-кода, производится анализ и подсказка программисту типа - «Эту переменную лучше типизировать».

В PHP сейчас допускается объявление типизированных переменных и «обычных».
Тем самым если программист понимает, когда уместно использование
типизированной переменной, а кода все же желательно использовать
динамическую переменную, можно достигнуть более оптимальной работы в run-time.

Владимир

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

На коболе не найдёшь

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

byko3y ★★★★
() автор топика
14 апреля 2020 г.
Ответ на: комментарий от Princesska

Я кобол, асм и кресты умею… так же и новомодные nodejs и свистон) и далеко не в те годы я с коболом столкнулся))) дело не в сложности/редкости языка, а в том что сейчас все фрэймворкнутые…

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.