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

★★★★

Макросов еще остро не хватает. Чтобы например сделать десериализацию JSON в иерархию классов.

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

Макросов еще остро не хватает. Чтобы например сделать десериализацию JSON в иерархию классов.

Я не совсем понимаю, что это за задача такая. Я вот пока что не вижу проблем у либ, которые именно этим и занимаются - превращают JSON в иерархию ассоциативных массивов питона.

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

Либа работает в рантайме. Макрос рожает код программы.

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

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

Эм, вот такого говна в питоне даром не надо. Сахарка за глаза хватает. Куда еще макросы?

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

во время написания кода генерировать питоновый код по JS-структурам.

Даже и так?? Ято подумал, имеется в виду нечто вроде препроцессора.
Зачем это кому то из коробки? Если кому то вдруг надо - пусть сам пишет, не?

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

Пачка десериализуемых классов с разным количеством аргументов различных типов наследуются от абстрактного класса. Есть поле type в JSON-объекте, при десериализации можно диспетчеризоваться по этому полю.

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

Пачка десериализуемых классов с разным количеством аргументов различных типов наследуются от абстрактного класса. Есть поле type в JSON-объекте, при десериализации можно диспетчеризоваться по этому полю.

https://jsonpickle.github.io/

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

Так тебе что надо то?
Чтоб твое приложение в рантайме брало джейсон, генерило из него код, и тут же его подгружало?
Ну тогда, наверное, надо самому это реализовать, не? Не знаю языков, которые умеют так «изкоробки», кроме, наверное, собственно JS.

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

В json модель, ты по ней генеришь код. Все эти лиспы так умеют, скала и эликсир, короче где есть макросы. Про dsl слышал? Вот это оно и есть.

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

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

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

я разве сказал, что эликсир не надо брать?

Выглядело, что так. Я подумал может есть какие-то аргументы против и заинтересовался.

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

Я совсем не в теме всего что связано с математикой, сможешь объяснить почему без разделяемой памяти никак?

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

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

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

Насколько я понимаю, у эрланга/эликсира очень малый оверхед для процессов (это не процессы ОС), удобное общение между ними и плюшки вроде GenStage.

что сожрет весь процессор и сеть

Пока звучит не очень убедительно. И причем здесь сеть?

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

А ты на чем собрался свои 10 млн. процессов запускать? Эликсир для того и нужен что его можно сразу на сотне компьютеров запустить, а так он нафиг не нужен.

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

А ты на чем собрался свои 10 млн. процессов запускать?

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

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

Хм, это крайне неаргументированные лозунги, ожидал больше конструктива.

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

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

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

и сеть

Wrong, во-первых, ipc вообще ничто не обязывает работать через сеть, во-вторых выделить общую память никто не запрещает. Не так всё и ужасно. Но это всё костыли, да.

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

Так, сорян, я не уловил контекст. Не понял, что речь строго про эликсир.

Но вообще, сисколов же там не может не быть. Так что мьютекст, наверное, можно заюзать.

А вообще, вне контекста тэликсирв, shared memory и spinlock — спасут отца русской демократии.

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

Ты говорила про несколько процессов же. Не важно, я изначально не в кассу ответил, так или иначе.

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