LINUX.ORG.RU

Есть ли годные гайды по стилю для питона

 , ,


1

2

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

  • Не используй monkey patching (изменения классов и функций в процессе работы приложения) без крайней необходимости;
  • Не используй классы, если это не навязывает библиотека и тебе не нужно переопределить операторы, предпочитай duck typing. Следствие — статическая типизация в питоне не работает;
  • Лямбды — говно, и функциональная парадигма в питоне близка к неюзабельности из-за трудности передачи блока кода аргументом. Язык изначально ориентирован именно на импертивный код аля «башпортянка», потому предпочитай list comprehension/generator expression вместо filter-map;
  • Предпочитай пересоздавать простые значения с нужным типом, а не передавать их как есть или по ссылке. При изменении значения ячейки используй новые значения, а не изменяй старые обьекты. Под капотом CPython уже создает-высвобождает объекты на каждый чих. Создать строку из строки в питоне стоит примерно ничего, но если внезапно вместо строки подвернется непонятный тип или None, то код рискует свалиться со стэком в неожиданном месте.

PS: мои прошлые работы по теме, которые дают советы «как не делать», но не дают советов «что же делать»:

Объектная модель питона
https://habr.com/ru/post/481782/ - О проблемах транслятора Python и переосмысление языка

Перемещено leave из talks

★★★★

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

Эээээээ, вот так

Поздравляю с наступающим Новым Годом

Линуксоидов, Андропоидов, Виндопоидов и иных товарищепоидов! ...
anonymous
()
Ответ на: комментарий от Virtuos86

хоть какой-то плюс

Скобочки! По ним так клёво прыгать.

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

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

И это мне больше всего взрывает мозг. Не секрет, что Гвидо добрую половину идей слизал с сишки, а вторую половину — с ABC. Однако же, каким-то чудом в языке нет структур при том, что есть типичные сишные массивы.

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

… что Гвидо

Что-то о нем ничего не слышно …

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

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

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

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

что есть типичные сишные массивы

Что? В Python нет типичных сишных массивов, а есть тип «список», который довольно сильно отличается от массива.

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

Что? В Python нет типичных сишных массивов, а есть тип «список», который довольно сильно отличается от массива

Чем? Давай, хотя бы одно отличие. Просто открой сорцы listobject.c, и увидь там тупейшкий «PyObject*[]». Что unboxed значения нельзя положить туда? Так вот сюрприз — ни одна структура питона не допускает unboxed значений. Это деградация по сравнению с сишными массивами, да, но это всё еще те же сишные массивы.

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

https://infostart.ru/1c/articles/1033891/ Вычисление 200 тысяч знаков числа pi

И теперь вычислим пи методом Чудновских:

Пи = 13591409;
ak = 1;
k = 1;
Для Сч = 1 По 20010 Цикл
	ak = (ak * -((6*k-5)*(2*k-1)*(6*k-1))+Ош)/(k*k*k*26680*640320*640320);
	Пи = Пи + ak*(13591409 + 545140134*k);
	k = k + 1;
КонецЦикла;
Пи = (Пи * КвКорень+Ош)/4270934400;
Пи = (1+Ош)/Пи;

За три минуты на 1С.
Как там на PHP и Python? …

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

За три минуты на 1С. Как там на PHP и Python? …

… и Метапрог?

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

каким-то чудом в языке нет структур

Это шиза Гвидона, что всё должно делаться одним единственным способом. Есть классы, а их можно использовать как структуры, значит структуры не нужны. Ну и пусть это неудобно, и никто так не делает, а просто херачит словари. Главное блюсти чистоту пистона. Просто Гвидон больной ублюдок, и там много ещё всякой придури. Один только переход на 3-й пистон чего стоит. Ещё тогда его надо было гнать на пенсию.

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

Copy/paste из статьи

(14) пруфов не нашел, хотя интернет забит статьями типа "почему Питон медленный"...
попробовал протестировать сам... взял свой компилируемый Net язык, Python 3.5, и 1С 8.3.13.1644
запустил вот этот код:
n = 139
j = 0
while j < 100000:
    j = j + 1
    fib1 = 1
    fib2 = 1
    i = 0
    while i < n - 2:
        fib_sum = fib1 + fib2
        fib1 = fib2
        fib2 = fib_sum
        i = i + 1
print(fib2)

 Скрыть

и соответственно:
n=139;    
j = 0;
Пока j < 100000 Цикл
    j = j + 1;
    fib1 = 1;
    fib2 = 1;
    i = 0;
    Пока i < n - 2 Цикл
        fib_sum = fib1 + fib2;
        fib1 = fib2;
        fib2 = fib_sum;
        i = i + 1;
    КонецЦикла;
КонецЦикла;    
Сообщить(fib2);

 Показать

результат такой:
компилируемый Net язык - 0,21 сек
питон - 5,7 сек
1С - 112 сек
т.е. 1С действительно подтвердила, что она очень медленная, но и Питон показал, что он все таки не компилятор...
Правда в этом тесте надо учесть,что разные языки используют разные числовые библиотеки... у 1С самые многоразрядные числа и она в них считает от начала и до конца.. А Питон судя по всему повышает разрядность чисел динамически по мере необходимости... мой язык считал в Net типе Decimal...
Скажу честно, от 1с ожидал большего :)
так что соглашаюсь с вами - Питон значительно быстрее 1с...
anonymous
()
Ответ на: комментарий от anonymous

Еще copy/paste

(61) кстати, на тему скорости. Вот, оказывается, есть такой проект - pypy, который компилит Python через трансляцию в С и выполняет его. При таком раскладе PHP отдыхает:
$ time pypy 1.py
50095301248058391139327916261

real 0m0,181s
user 0m0,169s
sys 0m0,012s

Вообщем то ребятам с 1С и … особо не верю в оптимальность их алгоритмов. Задача скорее для анализа - «Как лучше»? …

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

Это шиза Гвидона, что всё должно делаться одним единственным способом. Есть классы, а их можно использовать как структуры, значит структуры не нужны. Ну и пусть это неудобно, и никто так не делает, а просто херачит словари. Главное блюсти чистоту пистона

И не говори, я сам в шоке с того, какой трешак понавыдумывал Гвидо. Самое страшное то, что есть очень много людей, которые искренне считают, что Гвидо понимает что делает.

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

@byko3y, в треде Спрос на питонистов [теория тупости] (комментарий) вы пишите А если говорить серьезно,
то это вполне конкретная даваемая сверху
повестка дня, поскольку власти не нужны конкуренты и потому власть
взращивает инициативных людей, которые скорее перегрызут друг другу глотки, чем организуются и займут место этой власти.

Нужно подлить масла в огонь!

Шутка

Вся скриптуха это ЗАГОВОР корпораций …

Тем самым трудно создать хорошие проекты, которые составили бы 
конкуренцию проприетарным проектам...
anonymous
()
Ответ на: комментарий от anonymous

Я высказывал когда-то такое предположения, что одной из ролей крупных корпораций является формирование культуры в IT. Речь идет как провсякие там политкорректности и ЛГБД, так и про предпочтения в технологиях. Например, с подачи корпораций стартапы просто помешались на машинном обучении и сборе персональных данных (оно же Big Data).

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

Например, с подачи корпораций стартапы просто помешались на машинном обучении и сборе персональных данных (оно же Big Data).

Все просто.
У них тактика БАЗАРА
Семечки хорошо покупают?

ПРОДАЕМ ...
anonymous
()

узнал тупак по автору

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

Семечки хорошо покупают? ПРОДАЕМ …

Это же БИЗНЕС, а у него с мухами много общего …

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

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

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

В C++, например, структура - это тот же класс, только с открытыми членами по умолчанию.

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

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

В программировании де-факто действует закон: чем проще используемая сущность, тем она надежнее, тем она предсказуемее, тем быстрее ее задействовать в системе, тем проще ее поддерживать. Программисту в 90-95% случаев нужны простые структуры данных, но ради 5-10% применений эти 90-95% смешиваются с говном, то есть, обрастают пятыми и десятыми ногами. Аналогичная история про полиморфность: порядка 80-90% вызовов функций средней программы в вакууме мономорфны, но абсолютно каждая конструкция питона подразумевает полиморфность, которая по итогу чудовищно усложняет задачу понимания программы как человеком, так и компьютером.

В C++, например, структура - это тот же класс, только с открытыми членами по умолчанию

Ой, не напоминай: Опрос: Три-пять лучших фич C++

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

В программировании де-факто действует закон: чем проще используемая сущность, тем она надежнее, тем она предсказуемее, тем быстрее ее задействовать в системе, тем проще ее поддерживать. Программисту в 90-95% случаев нужны простые структуры данных, но ради 5-10% применений эти 90-95% смешиваются с говном, то есть, обрастают пятыми и десятыми ногами.

Можно какой-нибудь более конкретный пример? На какие грабли приходилось наступать из-за того, что нет структур в Питоне? Потому что пока такие размышления (с моей точки зрения, само собой) больше выглядят как размышления о сферическом коне в вакууме. А мне хотелось бы больше практики, что ли.

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

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

Можно какой-нибудь более конкретный пример? На какие грабли приходилось наступать из-за того, что нет структур в Питоне? Потому что пока такие размышления (с моей точки зрения, само собой) больше выглядят как размышления о сферическом коне в вакууме. А мне хотелось бы больше практики, что ли

Мне слишком много придется проводить ликбеза для того, чтобы наконец дойти до безоговорочного вывода, что отсутствие структур в питоне — зло. Я попытался выразить это кратко — тебя ответ не устроил. Огромное число говнокодеров на питоне применяют паталогические методы кодинга на питоне, каждый день херачат себя по лицу граблями, и ни о чем не парятся, ну а чего париться, если деньги платят норм? Я лишь пишу о том, что питон мог быть другим, и писать на нем было бы намного проще, а в текущей ситуация питон по сложности сравним с C++.

При этом предлагаю не забывать, что Питон противопоказано использовать в крупных проектах: слишком много там допущений и упрощений, которые в итоге выходят боком, нежели дают какой-либо профит по времени разработки

Вот. Ты начинаешь понимать, что что-то не так с питоном, но не можешь понять что и почему.

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

Мне слишком много придется проводить ликбеза

Достаточно было бы всего лишь одного конкретного примера. Но я так понимаю, у тебя его нет. И я даже догадываюсь почему. Ты ведь понимаешь, что Питон - одно сплошное зло (если речь идёт о крупных проектах). И появление там структур никак эту ситуацию не исправит.

Ты начинаешь понимать, что что-то не так с питоном, но не можешь понять что и почему.

Я понял это практически сразу, как закончил изучать его основы (а это случилось лет 7 назад примерно).

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

Поэтому твои попытки найти в нём Грааль (или хотя бы путь к нему) - пустая трата времени сродни попыткам натянуть сову на глобус. Я пытался до тебя это донести, но, видимо, получилось слишком туманно.

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

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

Поговорим про объективную реальность. Я 20 лет пишу на Python, участвовал в куче больших и маленьких проектов. Предыдущий мой проект — это два очень известных сервиса, которым уже около 15 лет, в которых миллионы строк на Python, написанных и поддерживаемых сотнями разработчиков. Но я не хочу называть эти сервисы конкретно.

Есть другие примеры: YouTube, Dropbox, Instagram, и масса других, с сотнями миллионов строк, существующие десятилетиями, над которыми работали и работают десятки тысяч разработчиков.

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

Python - не идеальный язык, но идеального в этом мире ничего нет, и не будет. И если бы он был таким ужасным, то его популярность не росла бы всё время, что он существует, он пережил и Perl5, и PHP, и Ruby, и много других языков, которые либо уже померли, либо популярность резко идёт на спад. И всё это, конечно, потому что он — «сплошное зло».

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

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

Объективно, перечисленные вами ЯП не сильно отличаются от пайтона, ни в лучшую, ни в худшую стороны. Поэтому «расцвет» пайтона и их «спад» не зависят от их сравнительных достоинств и недостатков, ну или как минимум обусловлен не только ими, а может даже, и совсем не ими.

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

Если что, я не пытался как-то унижать или оскорблять язык. Сам его использую. Для моих скромных нужд - более, чем достаточно.

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

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

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

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

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

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

Там же нужно конструктор ручками писать. Питонщикам это лень, и поэтому они просто разбрасывают везде туплы. А еще ведь есть __repr__, __str__ , __eq__. Поэтому датаклассы и добавили, чтобы не спотыкаться на нюансах. Конечно это должно было быть в версии 1.0.

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

Там же нужно конструктор ручками писать. Питонщикам это лень, и поэтому они просто разбрасывают везде туплы. А еще ведь есть __repr__, __str__ , __eq__. Поэтому датаклассы и добавили, чтобы не спотыкаться на нюансах. Конечно это должно было быть в версии 1.0

Да-да, датаклассы, NamedTuple — это всё про то, что в питоне нет структур. Но у меня все-таки мысль была на два шага дальше: отсутствие в питоне хороших структур данных привело к развитию патологичных подходов кодописания, которые нынче известны как «питоничность».

Кстати, ты забыл про __init__, поскольку имеющиеся способы конструирования переменных в питоне такие же ублюдочные, как и в C++. Забавно, что это проблемы не было даже в Си, ее пофиксили в крестах только в последних стандартах.

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

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

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

отсутствие в питоне хороших структур данных привело к развитию патологичных подходов кодописания

Ну да, причем это проблема не техническая, а религиозная. Получается, что даже сишка в этом плане выразительнее, ведь там есть struct и typedef со времён динозавров.

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