Есть библиотека на Python со множеством сущностей. Часть сущностей разработчик библиотеки считает приватными, а часть - публичными. Что значит «приватный» и «публичный» в контексте этого треда и моего вопроса:
- Приватный = «я не предполагаю, что сторонние пользователи будут использовать эти интерфейсы, я не уверен в стабильности этого интерфейса, не хочу показывать его во вне и хочу зарезервировать за собой право менять интерфейс без предупреждения»
- Публичный = «я предполагаю, что сторонние пользователи будут использовать эти интерфейсы, я буду стараться их не ломать, или, по крайней мере, ломать gracefully, например через deprecation warning-и, release note-ы или иные инструменты»
Теперь возникает технический и организационный вопрос, как выделить публичные интерфейсы, и тут есть варианты:
- Через соглашение об именовании приватных сущностей, например
_my_variable
или_MyClass
. Плюсы:
- Описано в PEP-8
Минусы:
- По-умолчанию, я предполагаю свой класс «приватным» в контексте библиотеки, т.к. лучше сначала всё закрыть и запретить, и только потом разрешить/открыть малую часть. Это значит, что 90% моих классов, которые по сути приватны, будут начинаться с
_
? Код превратится в кашу!
- При помощи
__all__
Плюсы:
- Описано в PEP
Вопросы:
__all__
говорит «это можно импортировать», но не говорит, где импортировать - для внутреннего использования внутри библиотеки или для внешнего пользователем. Вариантом решения тут могло бы быть именование package, начиная с_
, например:
mylib/__init__.py
mylib/_gears/__init__.py # <-- тут __all__ = ['X']
mylib/mylib.py # <-- тут from ._gears import X
и тогда код вида from mylib import Y
будет явно публичным, но from mylib._gears import X
- «ошибочным», т.к. мы явно залезаем в приватную часть либы.
Минусы/вопросы:
- Так кто-то еще делает? Выглядит велосипедно немного?…
- Есть версия, что «The RealDefinition™ is that whatever we include in the docs is public, otherwise not.» Плюсы:
- Просто и понятно
Минусы:
- Требует документации
- Недостаточно формально. Если с приватными пакетами можно явно сказать «у вас в импорте подчеркивание, сами виноваты», то тут надо «а где это описано в документации? вы уверены, что можете это импортировать? давайте читать доки…»
NOTE: другие языки или изменения языка программирования как способ решить задачу не рассматривается. Пожалуйста, не советуйте, этого! Это вопрос про Python.