Python: «Частный» модуль в пакете - PullRequest
33 голосов
/ 30 августа 2010

У меня есть пакет mypack с модулями mod_a и mod_b. Я намерен сам пакет и mod_a свободно импортировать:

import mypack
import mypack.mod_a

Однако я бы хотел оставить mod_b для эксклюзивного использования mypack. Это потому, что он существует просто для организации внутреннего кода последнего.

Мой первый вопрос: является ли общепринятой практикой в ​​программировании на Python иметь такие «частные» модули?

Если да, мой второй вопрос: каков наилучший способ донести это намерение до клиента? Должен ли я ставить перед именем подчеркивание (то есть _mod_b)? Или было бы неплохо объявить подпакет private и поместить туда все такие модули?

Ответы [ 4 ]

33 голосов
/ 15 февраля 2012

Я префикс частных модулей с подчеркиванием, чтобы сообщить намерение пользователю. В вашем случае это будет mypack._mod_b

Это в том же духе (но не полностью аналогично) рекомендации PEP8 называть модули расширения C с начальным подчеркиванием, когда оно обернуто модулем Python; то есть _socket и socket.

13 голосов
/ 05 сентября 2010

Решение, на котором я остановился, заключается в создании подпакета 'private' и размещении там всех модулей, которые я хочу скрыть. Таким образом, они остаются убранными, оставляя mypack список модулей чище и проще для анализа.

Для меня это тоже не выглядит унылым.

6 голосов
/ 31 августа 2010

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

- _single_leading_underscore: weak "internal use" indicator.  E.g. "from M
  import *" does not import objects whose name starts with an underscore.

- single_trailing_underscore_: used by convention to avoid conflicts with
  Python keyword, e.g.

  Tkinter.Toplevel(master, class_='ClassName')

- __double_leading_underscore: when naming a class attribute, invokes name
  mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

- __double_leading_and_trailing_underscore__: "magic" objects or
  attributes that live in user-controlled namespaces.  E.g. __init__,
  __import__ or __file__.  Never invent such names; only use them
  as documented.

Чтобы сделать весь модуль приватным, не включайте его __init__.py файл.

2 голосов
/ 30 августа 2010

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

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

...