Одиночный дистрибутив Python: модуль или пакет?

24

Предположим, у меня есть полезная функция или класс python (или любой другой), useful_thingкоторый вызывается, который существует в одном файле. Существуют два основных способа организации дерева исходных текстов. Первый способ использует один модуль:

- setup.py
- README.rst
- ...etc...
- foo.py

где useful_thingопределяется в foo.py. Вторая стратегия - сделать пакет:

- setup.py
- README.rst
- ...etc...
- foo
|-module.py
|-__init__.py

где useful_thingопределяется в module.py. В корпусе чехол __init__.pyбудет выглядеть так

from foo.module import useful_thing

так что в обоих случаях вы можете сделать from foo import useful_thing.

Вопрос: какой путь предпочтительнее и почему?

РЕДАКТИРОВАТЬ: Так как пользователь gnat говорит, что этот вопрос плохо сформирован, я добавлю, что в официальном руководстве по созданию пакетов Python, похоже, не комментируется, какой из методов, описанных выше, является предпочтительным. Я явно не даю свой личный список плюсов и минусов, потому что меня интересует, есть ли предпочтительный для сообщества метод, а не обсуждение плюсов и минусов :)

DanielSank
источник
Поделиться своими исследованиями помогает всем . Расскажите нам, что вы пробовали и почему это не соответствует вашим потребностям. Это свидетельствует о том, что вы потратили время, чтобы попытаться помочь себе, избавляет нас от повторения очевидных ответов и, прежде всего, помогает получить более конкретный и актуальный ответ. Также см. Как спросить
Гнат
1
@gnat: Спасибо за ссылку на вопрос. Мне известна хорошая практика вопросов, но в этом случае я не думал, что было бы целесообразно поделиться своим опытом, потому что это, вероятно, превратило бы то, что я задал как ясный вопрос «А или В», в запрос мнений. Как бы вы порекомендовали улучшить этот вопрос, не опираясь на его мнение?
DanielSank
@gnat: Другими словами, если бы меня интересовал список плюсов / минусов для двух методов, я бы спросил: «Каковы плюсы и минусы этих двух методов» и включил бы мой собственный неполный список.
DanielSank

Ответы:

17

Вы делаете самое простое, что работает для вас .

Для однофункционального модуля создание пакета абсолютно бессмысленно. Пакеты полезны для создания дополнительного пространства имен и / или для организации вашего кода по нескольким модулям.

jsonИ unittestмодули стандартной библиотеки Python действительно пакеты, например, для организации кода целей. Но совершенно нормально оставить код, в настоящее время живущий в одном файле Python, одним модулем.

Если вы хотите примеры:

Для хорошего примера проектов, которые действительно отлично используют пакеты, посмотрите на:

Нет официальной рекомендации; оба варианта полностью действительны.

Мартейн Питерс
источник
Так что официально не существует предпочтительного метода?
DanielSank
3
Нет, предпочтительного метода нет.
Мартин Питерс