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

Для того, чтобы это понять, не стоит читать объёмные статьи на тему «как так получилось?», «кто виноват?» и «что делать?».

Достаточно(self): просто(self): написать(self): пару(self): строк(self): на(self): этом(self): языке(self):.

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

откуда возникают быдлокодеры

Достаточно(self): просто(self): написать(self): пару(self): строк(self): на(self): этом(self): языке(self):.

и сразу становится скуууууучнооо.... из Reciprociality про M0:

Мы предполагаем, что субъективное ощущение скуки — это первый уровень механизма безопасности, аналогичный боли, который развился, чтобы заставить людей двигаться, чтобы они смогли открыть и исследовать окружающую их среду. Этот механизм мог бы привести к фатальным последствиям при попадании в безвыходное положение (siege - осада, западня), например, если приходится тихо сидеть на дереве, пока не уйдет хищник. Поэтому развился второй механизм безопасности, вводящий человека в состояние частичного отключения сознания из-за того, что человек достаточно долго скучает, что заставило бы его двигаться, если бы он имел такую возможность. В человеческом мозгу возрастает уровень нейроингибитора допамина. Это вызывает субъективное ощущение самопоглощающего комфорта, заставляющего человека оставаться неподвижным, но достаточно осознающим, чтобы заметить, когда можно будет безопасно двигаться, путем деактивации целого уровня сознания, функционально описанного ниже в «Использование обратной связи в познании».

По сравнению с эндорфином имеется важное отличие. Избыток допамина выделяется после периода скуки, а не в начале его. В то время как человек не может производить больше эндорфинов без испытания некоторого стресса, избыток допамина можно производить просто не делая ничего интересного! Таким образом, человек, находящийся в состоянии скуки достаточно долгое время, чтобы установился новый баланс химического состояния мозга, попадется на крючок собственного допамина и будет способен поддерживать свою собственную привычку просто вводя себя в скуку! Хотя привыкание может ослаблять некоторые истощающие (debilitating) последствия нахождения в состоянии отключения, он даже не начнет компенсировать утраченные способности.

Приводящим в движение органом, таким образом, является петля положительной обратной связи, посредством которой человек, попавший на крючок собственного допамина (Secretion — Секреция, гормональная система), будет поддерживать состояние скуки для стимуляции производства допамина (Constraint — Принуждение). Как и в случае других вызывающих привыкание (addictive) ситуаций, чем выше доза, тем больше желание, так что петля положительной обратной связи всегда будет приводить к стремлению увеличивать состояние скуки и уровень допамина в рамках возможного.

Переносчик (Vector)

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

Достаточно(self): просто(self): написать(self): пару(self): строк(self): на(self): этом(self): языке(self):

Явное объявление self - это просто детские шалости, как по мне. Претензия более существенная заключается в том, что классы в питоне вообще не нужны - и тогда остается вполне осмысленная функция с объектом-контекстом в виде первого аргумента. По хорошему вызов obj.method() должен был бы полностью равняться вызову method(obj).

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