Python
Programming
System Analysis and Design
Perfect code
Designing and refactoring
21 June

Python не запрещает вызов private/protected методов потому, что любит тебя :-)

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

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

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

Привычное != логичное.

Какие тут возможны варианты?

  1. Вы автор кода, по каким-то причинам решили, что данный метод не нужен в публичном доступе, ок, ваше право так думать, но почему это должно быть запрещено технически? Этот код вызывает демонов и его надо спрятать? Или это обычный код и другой такой же программист как вы может оказаться в ситуации о которой вы и подумать не можете и в которой ему нужно использовать этот код. Или вы думаете, что вы сверхчеловек и абсолютно точно знаете, что такого не может быть?
  2. Вы пользователь чужого кода — обычно о существовании непубличных методов вы ничего и не узнаете если не предпримете специальных усилий (protected методы могут быть задокументированы, но с указанием того какие они). Ну допустим вы сознательно и целенаправленно узнали о существовании какого-то непубличного метода и вызвали его, что случилось? Земля разверглась и оттуда выскочили Сатана с Саддамом? Или всё заработало как ожидалось? Слышу кто-то кричит — может сломаться при обновлении, конечно, но раз вы целенаправленно использовали непубличный метод, то понимаете этот риск (если нет, то вы не на своём месте). Тем более, что обновления это не спонтанный процесс как распад ядра атома урана, сломается всё в тестовом окружении. Конечно у некоторых бывает, что обновления имеют квантовую природу и происходят в самые непредсказуемые моменты в самых непредсказуемых местах, но тогда смешного говорить про какие-то там приватные методы, проблем будет полно и без них.

На самом деле за всеми этими рассуждениями стоит важный, можно сказать философский, принцип «Машина тупая, человек умный». Т.е. не машина должна принимать решения о том, что можно, а что нельзя, решение принимать человеку.

Можно парировать это сказав, что автор кода (человек или кто-то разумный) решил, что нельзя, но тут вступает в дело другой принцип, принцип свободы и ответственности: «Если ты уже поделился чем-то с другими, не диктуй им как они должны это использовать, они сами отвечают за свои действия», тут мы как раз пришли к тому, что мы все тут взрослые люди и отвечаем за свои действия.

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

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

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

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

+20
10.1k 42
Comments 106
Top of the day