Соглашение о кодировании частных функций Python

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

Я так понимаю в питоне нет абсолютно приватных функций. Но каков наилучший, наиболее аккуратный или наиболее часто используемый стиль для различения «общедоступных» и «приватных» функций?

Я перечисляю некоторые из известных мне стилей:

  1. используйте __all__ в файле модуля, чтобы указать его «общедоступные» функции (Что такое python __all__ переменная уровня модуля для?)
  2. используйте подчеркивание в начале имени "частных" функций

Есть ли какие-либо другие идеи или соглашения, которые люди используют?

Большое тебе спасибо!


person Kaifei    schedule 23.02.2013    source источник


Ответы (1)


Из документации модуля Python Class. :

Частные» переменные экземпляра, к которым нельзя получить доступ, кроме как изнутри объекта, не существуют в Python. Однако существует соглашение, которому следует большая часть кода Python: имя с префиксом подчеркивания (например, _spam) следует рассматривать как закрытую часть API (будь то функция, метод или элемент данных). . Его следует рассматривать как деталь реализации, и он может быть изменен без предварительного уведомления.

Поскольку существует допустимый вариант использования членов, принадлежащих к классу (а именно, чтобы избежать конфликтов имен с именами, определенными подклассами), существует ограниченная поддержка такого механизма, называемого изменением имени. Любой идентификатор в форме __spam (не менее двух начальных символов подчеркивания, не более одного нижнего подчеркивания в конце) текстуально заменяется на _classname__spam, где classname — это имя текущего класса с удаленными начальными символами подчеркивания. Это искажение выполняется независимо от синтаксической позиции идентификатора, если оно происходит в определении класса.

person Eric Hydrick    schedule 25.02.2013
comment
Спасибо! Так что, как правило, люди будут просто использовать начальное подчеркивание, чтобы различать публичные и частные функции в модуле? - person Kaifei; 26.02.2013
comment
Главным образом. Как говорится в документации, это соглашение, вы все равно можете получить доступ к функциям, как если бы они были общедоступными, но правильный способ сделать что-то — притвориться, что их на самом деле нет. - person Eric Hydrick; 26.02.2013
comment
Применяется ли это соглашение к функциям, не основанным на классах? - person radtek; 21.04.2017
comment
@radtek Я бы сказал, что это должно применяться к любой функции, которую вы не хотите считать частью публичного контракта для этого скрипта. - person Eric Hydrick; 21.04.2017