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)

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

firkax ★★★★★
()

Все звучало как среднеаргументированный наброс до

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

Если настолько проиграл с динамической типизации, что каждое принимаемое значение хочется рекастить для надёжности, то нет, никакой стайлгайд тебя не поддержит, не надейся.

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

Если настолько проиграл с динамической типизации, что каждое принимаемое значение хочется рекастить для надёжности, то нет, никакой стайлгайд тебя не поддержит, не надейся

А в чем проблема кастить? К тому же, я написал «предпочитай». Ты таким образом одновременно как бы сразу и документируешь типы в своем коде, а не как обычно, передаешь значение дальше, дальше, еще дальше... ой, а что случилось?

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

Следствие — статическая типизация в питоне не работает.

В полном смысле слова нет. Но если аннотировать типы аргументов, использовать NamedTuple, dataclass, то помогает сильно.

Не используй классы

Используй классы. Это удобно.

qaqa ★★
()

предпочитай duck typing. Следствие — статическая типизация в питоне не работает

Сколько лет старались запиливали тайп-хинтинг, специальные костыли придумывали для второго питона и вот раз так - и эксперты на лоре авторитетно говорят «ненужно»

Nastishka ★★★★★
()

предпочитай duck typing. Следствие — статическая типизация в питоне не работает;

Вот поясни, что о чём.

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

Не, до перловых one-liners на пару мегабайт им далеко.

Shadow ★★★★★
()

Ни разу не гуру питона, не программист и даже не айтишник (ну, почти), но что-то веет не разговором умных и компетентных людей, а тупняком. Ты хочешь сделать из питона любимую сишечку? Комментаторы обнимаются в порыве ненависти к питону? Ну так используйте богоподобную сишечку, делов-то. На ней тоже можно сочинать башепортянки. Не верите? Спросите у Леннарта.

Bagrov ★★★★★
()

1 - да, а кто-то в здравом уме так делает вообще?

2 - спорно, вдруг я весь проект хочу в ООП стиле обмазывать?

3 - скорее да, чем нет, но тоже вкусовщина по большей части

4 - ЯП вроде как с динамической типизацией, не? Если так мешает Java/C# головного мозга, то аннотации типов и mypy, иначе смысла в аннотации тоже нету

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

Первое правило разработки на питоне - не слушать тех, кто не разрабатывает на питоне.

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

Зачем тебе {тут_любое_слово} если у тебя в алгоритме императивная функция?

С таким подходом, незачем.

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

Ви боитесь императивных функций?

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

Shadow ★★★★★
()

Не используй классы

функциональная парадигма в питоне близка к неюзабельности

Какой замечательный ЯП!

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

Какой замечательный ЯП!

Это да!
И хвост у него красивей чем у других гадюк …

anonymous
()

что же делать

Валить с планеты, где питон самый популярный ЯП. Она обречена.

bread
()

@byko3y, многие создают проблемы и героически их решают
ИМХО суть такой работы

Из пустого в порожнее ...
anonymous
()
Ответ на: комментарий от bread

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

anonymous
()

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

Все просто …
Профилируйте загрузку и

ВСЕ ПОЙМЕТЕ!
anonymous
()
Ответ на: комментарий от t184256

Так не делают; если уж очень хочешь, аннотируй типы

И дальше что? Как это поможет с какним-нибудь bytes-like или path-like объектом, переданным как строка?

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

Следствие — статическая типизация в питоне не работает.

В полном смысле слова нет. Но если аннотировать типы аргументов, использовать NamedTuple, dataclass, то помогает сильно

При чем тут ститическая типизация к namedTuple и dataclass? Они затыкают дырку в виде отсутствие удобных примитивов составных типов данных в питоне, вместо которых сишные массивы, убогие кортежи, реализованные внутри на тех же сишных массивах, и ассоциативные массивы с отвратительным синтаксисом доступа. Люди хотят «s.a = 1», а им суют «s['a'] = 1» или требуют объявлять классы.

Не используй классы

Используй классы. Это удобно

Внезапно, датакласс не обязательно объявлять через объявление класса. Но в нынешней ситуации наверное использовать синтаксис класса удобнее всего. Я просто подчеркиваю, что в случае датаклассов ты сам не используешь объявленный тобой класс, то есть, это что-то на грани использования классов.

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

Лямбды — говно, и функциональная парадигма в питоне близка к неюзабельности из-за трудности передачи блока кода аргументом

2.10 Lambda Functions Okay for one-liners. Prefer generator expressions over map() or filter() with a lambda

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

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

Сколько лет старались запиливали тайп-хинтинг, специальные костыли придумывали для второго питона и вот раз так - и эксперты на лоре авторитетно говорят «ненужно»

Они сами посыпали голову пеплом и разрабатывали новый PEP для статической проверки утиных типов. Так что «они» почти согласились со мной.

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

предпочитай duck typing. Следствие — статическая типизация в питоне не работает;

Вот поясни, что о чём

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

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

Там всё - класс, как можно их не использовать?

Ты еще скажи, что там всё сишка, так что на питоне нужно писать сишку.

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

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

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

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

Еще пару советов и ТС начнет Си использовать …

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

Я вообще не погромист, но одобряю. А зачем ещё питон?

На тройки в универе учились, вот и выбрали питон …

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

2 - спорно, вдруг я весь проект хочу в ООП стиле обмазывать?

ССЗБ.

4 - ЯП вроде как с динамической типизацией, не? Если так мешает Java/C# головного мозга, то аннотации типов и mypy, иначе смысла в аннотации тоже нету

Вопрос не в типизации, а в том, как это говно тестировать и заставлять работать. Когда у тебя какая-то бессмысленная хрень в стэке вылазит, то тут уже не колышет, какая там типизация — хочется просто перехватить ошибку там, где она произошла. То есть, банально проверить аргументы у функции.

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

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

Ну так а я о чем в исходном сообщении писал?

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

ЕМНИП он этим и занимается, но, может, я ошибаюсь

Ну да, последний пет у меня сишный, работаю по сишке тож.

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

Где. Я не знаю ни одного отличника, который бы чем-то руководил.

Если не секрет.
Для каких задач Python используете?
Вопрос не с подковыркой …

К примеру на 1С 7.7 /который весь COM, который ни когда производительным не был/ многие проекты работают весьма шустро.
Это к тому, что Python для многих задач вполне можно использовать …

А на комменты внимания не обращайте /то дурачусь, то дело пишу. Научитесь отличать …/ …

anonymous
()

Мечтаю о расширении языка Си с помощью прототипов, как в Self, Lua, JavaScript - вот это была бы бомба, плюс каналы из Go для многопоточности и более жирная стандартная либа, включающая рантайм и типы для многопоточности аля акторы в Swift

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

Мечтаю о расширении языка Си с помощью прототипов, …

Чего мечтать то?
У меня и интроспекция в run-time есть, …
Проблема не в Си …
Уже много лет на ЛОР, но так и не довелось прочитать толковых комментов по этим вопросам.
Использование метаданных позволяет вести разработку алгоритмов, которые ни какие стандарты C++ и близко не решают …

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

функциональное погромирование в питоне не работает.

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

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

Использование метаданных позволяет вести разработку алгоритмов, которые ни какие стандарты C++ и близко не решают …

Кстати метаданные многие проекты используют.
К примеру СУБД, …, …, …
Но в таких проектах в основном метаданные «прибиты гвоздями» к классам, …
У меня «гвозди» не используются …

anonymous
()

Классы топ, засверлись

Признак того, что объект не должен быть классом — если в нём всего 2 метода, и один из них — инициализация, init

Добрый вечер. Датаклассы завезли уже года 3-4 назад.

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

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

ЛОЛ, нет. Кто даст затюханому ботану людьми руководить то?

Ээээээээээ, у нас за последние два месяца три начальника юр.отдела поменялись ….
БОТАНЫ бывают и полезны.
А вообще то у каждого человека есть таланты /в хорошем понимании о чем речь/.
Но талант без труда

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