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-кодеры испытывают удовольствие от говнокодинга.

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

Global Interpreter Lock (GIL) — это способ синхронизации потоков, который используется в некоторых интерпретируемых языках программирования, например в Python и Ruby. Когда один поток захватывает его, GIL, работая по принципу мьютекса, блокирует остальные.

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

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

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

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

Я этот софт могу и из баша вызывать, но это не делает его мультипоточным.

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

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

В голову не приходит что задачи можно параллельно выполнять? Нужно получить 10 страничек с разных URL почему не запустить каждую в свой поток?

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

В голову не приходит что задачи можно параллельно выполнять? Нужно получить 10 страничек с разных URL почему не запустить каждую в свой поток?

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

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

Охереть у тебя задачи.

Нужно с 10 URL получить json и распарсить его, раз в минуту. На плюсах мне это писать?

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

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

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

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

Если написать это асинхронно в одном потоке, то ещё и быстрее получится.

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

получить 10 страничек с разных URL

Это жи не про потоки!
Это про асинхронность.

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

Нужно с 10 URL получить json и распарсить его, раз в минуту. На плюсах мне это писать?

асинхронно хоть с grequests брать, парсить по готовности каким-нибудь ujson (который быстрый и на Цэ).
Одного потока достаточно.

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