LINUX.ORG.RU
ФорумTalks

Претензии хейтеров к Питону

 ,


1

2

По результатам чтения ЛОР.

1) Отступы «легко ломаются при копипасте и редактировании». Этот пункт выглядит как форма фобии, все хейтеры ее упоминают, но нет ни одного воспроизводимого практического примера, когда что-то сломалось с отступами, и поэтому не понятно, есть проблема или нет. Может просто настроить редактор или взять правильный?

2) GIL. Для некоторых применений (numpy) это не проблема.

3) Нет многострочных лямбд. Но есть локальные функции и list comprehensions.

Что еще?

Я не говорю, что Питон надо толкать во все ниши, но просто некоторые высказывания ЛОРовских аналитиков звучат в таком стиле: «что, Питон? Посмотрел. Не_как_в_моêм любимом_языке. Закрыл. Нинужно.» А чего стоят однострочные комментарии экспертов типа «в 21м веке язык без фичи Х - не язык»...

★★★★★

Мне даже Пролог более понятен как нечто необычное и нужное якобы в алгоритмах.

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

Расскажите всем нафига он нужен!

Для тренировки скилла по расставлению отступов. Чтобы пробел не ржавел.

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

Кстати, а кто мне запретит вставлять пустую строку в начале блока в коде на питоне?

Тебе никто ничего не запретит. Но на питоне ты, к счастью, не пишешь, поэтому там некому так делать.

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

А таперь я тебе гарантирую, что 0 не будет и твоя программа без этой проверки стала 1) в 10 раз быстрее. 2) Короче.

Если ты это можешь гарантировать статически, то не используй Option. Если ты это гарантируешь динамически, то пиши код, который по Option<i32> и другому контексту возвращает i32.

Эффективность будет не то что в динамике. Проверки есть, но питон же тоже не бросает исключения без проверок, по волшебству. Статические типы позволяют уменьшить количество рантайм проверок. Если у тебя всегда число, то тип i32 и проверок нет, если может быть, или не быть, то Option<i32>, в питоне же (и другой динамике) всегда будет неявная проверка в рантайме и проверка типа и проверка none. В расте, свифте и котлине нету даже null.

vlad9486
()

Что еще?

  • отсутствие блоков со своей областью видимости переменных
  • крайне криво реализованный async/await, кладущий запрет на возможность преобразования имеющихся синхронных библиотек в асинхронные
  • большинство вещей реализованы __хаками__
  • страшная замусоренность глобального неймспейса: is, in, lst, dict, from, итп. Многие имена опасно применять в качестве имён переменных, некоторые нельзя применять даже в качестве имён методов. жесть
  • крайне криво реализованный механизм подключения внешних модулей. отсутствует нормальный режим экспорта. отсюда засилие жутких вариантов с дублями вроде
    datetime.datetime.now()
  • очень кривая система тестирования. Она задумана такой, чтобы тесты писать было максимально сложно. write-only
  • декораторы. на которых пишут даже циклы (sic!)
  • крайне ацтойный ООП, я правда пока не искал: может быть кто-то делал ООП-фреймворк для Python?

в общем Python - write-only язык

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

И главное: при разработке Python, а так же большинства его библиотек - никто не парится вопросом обратной совместимости. Это удручает сильно

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

если бы было возможно писать многострочные лямбды, то те же декораторы можно было бы писать более красиво:

def mydecorator(fn):
   return lambda x, y, z:
        foo()
        bar()
        return fn()

Да и вообще любой код который предполагает функциональное программирование. например map-reduce.

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

классическое: у нас говнолямбды. я их не применяю никогда. они не нужны.

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

дык Perl!

динамическая типизация, это ведь не только работа с типами при присвоении, но и приведение типов.

Вот python:

Python 3.6.7 (default, Oct 21 2018, 08:08:16) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = True
>>> b = 10
>>> a < b
True
>>> a = '1'
>>> b = 10
>>> a < b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'
>>> a = 1.01
>>> b = 10
>>> a < b
True
>>>

как говорится: или крестик или трусики.

по поводу типов кстати.

тупизм на тему «выбрасывать исключение на арифметике/сравнениях разных типов» растёт из тупизма что оператор «плюс» сделали одинаковым оператором «конкатенация», а так же операторы «больше/меньше» сделали одновременно и строковыми и чисельными. И отсюда двоякости и тупизьм

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

кладущий запрет на возможность преобразования имеющихся синхронных библиотек в асинхронные

Ваши слова очень забавны...

большинство вещей реализованы __хаками__

__чем__ ?

крайне ацтойный ООП, я правда пока не искал: может быть кто-то делал ООП-фреймворк для Python?

Следующий пошел. Где ООП не ацтойный?

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

И главное: при разработке Python, а так же большинства его библиотек - никто не парится вопросом обратной совместимости. Это удручает сильно

Я запускаю на 2.7 софт написанный в 2003г. ЧНТД? Хочу пример где не так...

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

Мсье не в теме...

>>> def foo(): pass
... 
>>> def bar(): pass
... 
>>> def fn(): pass
... 
>>> def mydecorator(fn):
...     lambda x, y, z: \
...         foo(); \
...         bar(); \
...         fn()
... 
>>> 
dem ★★
()
Ответ на: комментарий от dem

Следующий пошел. Где ООП не ацтойный?

Perl Moose/Mouse.

в отличие от python - ООП система ведет жетский учёт атрибутов на стадии определения класса (а не по пути).

имея на вооружении учетную систему по атрибутам, в больших системах можно единообразить многие вещи, вроде пометок «эти атрибуты выгружаем в JSON API, а эти нет», «эти кладём в БД, а эти нет».

а так же динамически вычисляемые на стадии обращения к ним. итп итд.

всё это можно делать конечно на любом языке, но с тем или иным количеством секса.

я ж написал: возможно кто-то работал в Python над созданием ООП-фреймворка. но местная публика врядли знает об этом

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

Я запускаю на 2.7 софт написанный в 2003г

и для софта написанного в 2003-м все дистрибутивы и держат до сих пор 2.7. а для софта написанного в 2015++ держат 3.5

Хочу пример где не так

да практически везде не так. кроме Python в дистрибутивы больше практически никакие скриптовые языки разных версий одновременно не включают.

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

это однострочная lambda, она не является функцией. поэтому в нее не вставить пару циклов for и/или секцию if-elif-else

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

Вот за это я и выкинул перл ибо это шизофрения...

так в примере, который ты коментируешь, Python.

почему bool и int можно сравнивать, а int и str - нет?

вот где шизофрения!

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

что еще остается? на конструктивную критику только и говорить «гы-гы»

А что говорить - вы как Шариков. Вы как представляете синхронную PIL превратить в асинхронную АВТОМАТИЧЕСКИ? Или gzip...

Жду идеи... Может я Идиот, так я не стыжусь если так, то признаюсь.

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

Perl

В Perl нет OOP...

имея на вооружении учетную систему по атрибутам, в больших системах можно единообразить многие вещи, вроде пометок «эти атрибуты выгружаем в JSON API, а эти нет», «эти кладём в БД, а эти нет».

То, что вы говорите похоже на бред. Покажите пример атррибутов какие кладем в JSON, а какие нет. Я хочу видеть этот АД.

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

и для софта написанного в 2003-м все дистрибутивы и держат до сих пор 2.7. а для софта написанного в 2015++ держат 3.5

Сомневаюсь, что вы когда то программировали. Я вам тайну открою текст qbasic не выполнится в visualbasic или gambas...

И это по большинству ЯП.

да практически везде не так.

Пример. Дайте пример. Только с графикой, соединением с БД и прочим... Может вы UI GTK1 запустите в GTK3... Qt, Не? Сколько там либ MySQL в PHP... Давайте покажите мастерство... Scheme? Forth?

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

это однострочная lambda, она не является функцией. поэтому в нее не вставить пару циклов for и/или секцию if-elif-else

Вам nl натравить на нее?

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

почему bool и int можно сравнивать, а int и str - нет?

Выб выучили матчасть.... Тогда вопросов не будет почему жопу с пальцем сравнивать нельзя. Bool подмножество Int (намек)

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

А что говорить - вы как Шариков. Вы как представляете синхронную PIL превратить в асинхронную АВТОМАТИЧЕСКИ? Или gzip...

на Perl у меня был веб. проект. в парадигме MVC

в какой-то момент решили сделать его асинхронным (множество причин к этому толкало).

взяли Coro и перевод всего проекта на асинхрон обошелся где-то в 4-5% переписанного кода. причем если говорить об MVC, то M и V остались ВООБЩЕ без изменений, а C немножко помутировал.

теперь если мы берём Python.

язык (именно язык!) запрещает использовать await без обрамления async (глупость неимоверная: просто эти клинические дебилы не додумались до простой вещи: главный поток разметить как одну из корутин, пусть бы даже фейковую. Они взяли и замутили семантическое ограничение. Кретины).

соответственно например библиотеку py-postgres невозможно сделать одновременно синхронной и асинхронной. ее переписали. сделали asyncpg. библиотеку requests нельзя переписать так чтоб она была и синхронной и асинхронной. соответственно пишут асинк форки.

и так всё.

а почему? а потому что разработчики выводят в прод фичу не подумав над ней и/или не посмотрев в большой мир: как решают другие ту же проблему.

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

взяли Coro и перевод всего проекта на асинхрон обошелся где-то в 4-5% переписанного кода. причем если говорить об MVC, то M и V остались ВООБЩЕ без изменений, а C немножко помутировал.

Тоесть переписывать надо - да? Тогда мьсе вы соврамши ибо вот вам https://github.com/aio-libs

Суслика видишь? А он есть.

Они взяли и замутили семантическое ограничение. Кретины

Ага.. https://en.wikipedia.org/wiki/Python_(programming_language)#Features_and_phil...

Explicit is better than implicit

Яб бросил Python если бы они сделали «главный поток разметить как одну из корутин, пусть бы даже фейковую». Впрочем плавали и все кто это делал поняли, что это ГЛУПОСТЬ и за такое надо руки отрывать....

а почему?

Потому, что разработчики не идиоты и слышали про состояние гонки. Вот вам пример https://habr.com/ru/company/pvs-studio/blog/439502/

Каждая из первых двух инструкций movupd перемещает два значения типа double в 128-битный регистр SSE2 (double имеет размер 64 бита, поэтому регистр SSE2 может хранить два значения типа double). Другими словами, сначала считываются четыре исходных значения, а уже потом они приводятся к int (операции cvttpd2dq). Операция punpcklqdq перемещает четыре полученных 32-битных целых значения в один регистр SSE2 (%xmm0), содержимое которого затем записывается в оперативную память (movups). А теперь главное: наша C-программа формально требует, чтобы доступ к памяти происходил в следующем порядке:

Считать первое значение типа double из src[0]. Записать первое значение типа int в dst[0]. Считать второе значение типа double из src[1]. Записать второе значение типа int в dst[1]. Считать третье значение типа double из src[2]. Записать третье значение типа int в dst[2]. Считать четвёртое значение типа double из src[3]. Записать четвёртое значение типа int в dst[3].

Однако все эти требования имеют смысл только в контексте абстрактной машины, которую и определяет стандарт C; порядок действий на реальной машине может отличаться. Компилятор волен переставлять или изменять операции при условии, что их результат не противоречит семантике абстрактной машины (так называемое правило as-if — «как если бы»). В нашем примере порядок действия как раз другой:

Считать первое значение типа double из src[0]. Считать второе значение типа double из src[1]. Считать третье значение типа double из src[2]. Считать четвёртое значение типа double из src[3]. Записать первое значение типа int в dst[0]. Записать второе значение типа int в dst[1]. Записать третье значение типа int в dst[2]. Записать четвёртое значение типа int в dst[3]

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

соответственно например библиотеку py-postgres

1) Такой библиотеки нет - есть psycopg2

2) При применении http://www.gevent.org/api/gevent.monkey.html у вас раз из 30 случаев отрывайт яйки... Я нашел почему, интернет кишит вопросами.. А все из за состояния гонки..

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

То, что вы говорите похоже на бред. Покажите пример атррибутов какие кладем в JSON

Допустим класс User


package User;
use Mouse;
use MouseX::MyVars;

has id =>
   is => 'ro',
   vars => { jsonable => 1 },
   isa => 'Int';

has login =>
   is => 'ro',
   vars => { jsonable => 1 },
   isa => 'Str';

has password =>
   is => 'ro',
   isa => { jsonable => 0 },
   isa => 'Str';

Теперь мы можем для ВСЕХ моделек нашего сложного проекта, не только для User написать скажем метод to_json, который учтёт эти пометки и проигнорит те которые не помечены для сериализации:

sub to_json {
  my ($self) = @_;
  my %res;
  for $a ($self->meta->get_all_attributes) {
    next unless $a->vars->{jsonable};
    $res{$a->name} = $a->$name;
  }
  encode_json(\%res)
}

Итого: БОЛЬШОЙ проект можно оснащать единообразными фичами поскольку есть

  • штатный способ определения атрибутов
  • штатный способ доступа к статическому списку атрибутов и их атрибутов
  • штатный способ расширения всего этого механизма
  • система контроллирует рантайм доступ к несуществующим атрибутам

по последнему пункту так вообще

в питоне разработчик опечатывается и пишет

self.foa = bar;  # вместо self.foo = bar;

и этот замечтательный езык молча хавает (как и двойные определения def foo, затем def foo), а разработчик потом ищет ошибку самостоятельно. ППЦ

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

Выб выучили матчасть

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

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

в питоне разработчик опечатывается и пишет

self.foa = bar; # вместо self.foo = bar;

и этот замечтательный езык молча хавает

Знаешь, чтение учебников по Python сэкономило бы тебе время, а ЛОР - флейм-трафик. Твои претензии - на уровне нерадивого птушника.

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

чтение учебников

когда по делу сказать нечего, остается ляпать фразы про учебники.

как это банально

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

когда по делу сказать нечего, остается ляпать фразы про учебники.

как это банально

А твой случай вообще банален и больше ничего не заслуживает. После килотонн твоего наглого нытья помогать тебе нет никакого желания.

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

Тогда мьсе вы соврамши ибо вот вам https://github.com/aio-libs

повторяю: aio-libs - это НОВЫЕ библиотеки.

а старые (например requests) НЕВОЗМОЖНО заставить работать в асинхронной среде, даже самим разработчикам requests. Библиотека ЛИБО синхронная полностью. ЛИБО асинхронная.

именно из за требования совместного применения async/await.

а в Perl например написали имплементатор драйвера на Coro для LWP::UserAgent и он без тотального переписывания просто стал работать в асинхронной среде.

если у Вас модель user.save сохраняет в БД используя py-postgres, то Вы никогда не приведете код в состояние чтобы вызов

user.save()

Сохранял бы в БД пользователя, а вызов

await user.save()

делал бы ровно то же самое но в асинхронной среде.

да и вообще. использование асинхронной разметки в нормальных языках делается только около IO.

А тут если хоть одна из подфункций сколь угодно глубокого стека делает async/await свитч, то будь добёр функцию самого верхнего уровня разметить как async.

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

Теперь мы можем для ВСЕХ моделек нашего сложного проекта, не только для User написать скажем метод to_json, который учтёт эти пометки и проигнорит те которые не помечены для сериализации:

Это какой то ужас.

1) Тот кто пишет класс не знает КАК его будут использовать. Скажите какие поля вашего Юзера я могу записать в YAML?

2) Что делать если я для обычного юзера запрашивающего json хочу получить одни поля, а для супервизора еще и права...

В общем вот как делается по человечески https://www.django-rest-framework.org/

Ну а как делать ИДЕАЛЬНО http://muthukadan.net/docs/zca.html#adapters (хотя я думаю вы не поймете ибо куда на питонистам).

self.foa = bar; # вместо self.foo = bar;

Ничего если аттрибуты можно создавать рантайм? Тесты - не? В Perl с доктестами видимо все хреново... Ну удачи 1 + 'жопа' вас не раз удивит. Вот уж где я прямо за сторонников СТРОГОЙ типизации... https://netology.ru/ckfinder/userfiles/images/1(11).jpg

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

Яб бросил Python если бы они сделали «главный поток разметить как одну из корутин, пусть бы даже фейковую». Впрочем плавали и все кто это делал поняли, что это ГЛУПОСТЬ и за такое надо руки отрывать....

адепт просто говорит «это глупость», а вот на вопрос ПОЧЕМУ глупость - адепт ответить не может.

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

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

если у Вас модель user.save сохраняет в БД используя py-postgres, то Вы никогда не приведете код в состояние чтобы вызов

А тут если хоть одна из подфункций сколь угодно глубокого стека делает async/await свитч, то будь добёр функцию самого верхнего уровня разметить как async.

Слава богу не сделаю. И молюсь всем богам чтоб такого не произошло...

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

Потому, что разработчики не идиоты и слышали про состояние гонки

какие-то гонки. при чём они к обсуждаемому вопросу?

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

чо, ты меня поразил!

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

адепт просто говорит «это глупость», а вот на вопрос ПОЧЕМУ глупость - адепт ответить не может.

Потому, что асинхронный алгоритм != синхронному. Я уже несколько раз написал про состояние гонки...

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

раз из 30 случаев отрывайт яйки

чтобы использовать микроскоп, надо сперва пройти обучения и понимать для чего он нужен и как им пользоваться (по ссылке не ходил)

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

После килотонн твоего наглого нытья

какими фразами стал бросаться, какими фразами!

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

чтение учебников по Python сэкономило бы

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

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

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

Именно. Поэтому вам бы я советовал сначало продти обучение что такое асинхронные алгоритмы и как они вам оторвут яйки...

псевдокод

srv = Server()
srv.login(login, password)
srv.call_method('tear_egg_rsync')
srv.logout()

Что будет в синхронном случае и асинхронном?

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

Потому, что асинхронный алгоритм != синхронному

это почему это?

когда я в корутине пишу


results = []

for url in urls:
   resp = await http.get(url)
   results.append(resp)

то запросы у меня выполняются (в пределах той же корутины) строго последовательно - точно так же как и в синхронном коде.

отличие от синхронного кода только в том, что корутин работает параллельно несколько.

Если корутина (таск) всего одна, то код из асинхронного вырождается в синхронный

и вот если бы не эти кретинские ограничения на использование async/await строго совместно, то можно было бы писать код одинаково работающий и в синхронной парадигме программирования и в асинхронной.

Например для noSQL баз данных на Perl часто так и делают: пишут драйвер работающий только в асинхронной парадигме, а в синхронной работает он же: в целом тех, кто пользуется драйвером в синхронной парадигме не сильно заботит то что там на бакенде трудится асинхронная машина, пусть и обслуживая всего один, а не множество потоков

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

что в синхронном, что в асинхронном случае этот код выполнит последовательно логин, вызов метода, логаут.

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

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