Существуют ли правила для именования одномодульных пакетов Python?
Должно ли имя, которое я даю одинокому модулю в пакете Python, совпадать с именем пакета?
например, если у меня есть пакет с одним модулем со структурой
super-duper/
super/
__init.py___
mycode.py
...
Я могу создать пакет super-duper
на PyPi, который при установке будет иметь две папки в site-packages
С именами, которые не соответствуют:
super/
super_duper-1.2.3.dist-info/
это означает, что для импорта моего проекта я использую
import super
вместо фактического имени пакета (super_duper
)
это, похоже, противоречит обычной практике (судя по папкам для раннего каждого другого пакета, который я вижу в site-packages
), которые следуют шаблона
same_name/
same_name-1.2.3.dist-info/
для пакета PyPi same-name
.
должен ли я вместо этого (всегда) структурировать свои проекты так, как
super-duper/
super_duper/
__init.py___
mycode.py
...
чтобы убедиться, что имя пакета и имя импорта модуля "совпадают":
import super_duper
есть ли соответствующая лучшая практика или правило, которым я должен быть преследует?
4 ответов
короткий ответ на ваш вопрос: да, как правило, рекомендуется, чтобы имя вашего модуля соответствовало имени пакета для отдельных пакетов модулей (которые должны быть наиболее опубликованными пакетами.)
немного более длинный ответ заключается в том, что соглашения об именах всегда являются политическими. Общепринятым методом определения языковых стандартов в Python является процесс под названием "Предложения по улучшению Python" (PEPs). PEPs управляются органом редакторов PEP и являются публично проиндексированных для обзора и комментариев.
в настоящее время существует только один "активный" (принятый и реализованный) ОПТОСОЗ, который, как мне известно, охватывает соглашения об именах модулей, который является PEP 8:
модули должны иметь короткие имена в нижнем регистре. Подчеркивания могут быть используется в имени модуля, если он улучшает читаемость. Пакеты Python следует также иметь короткие, все-строчные имена, хотя использование подчеркивает это обескураженный.
тем не менее, есть еще одно предложение в процессе разработки под названием PEP 423 что рекомендует именно то, что вы заявляете в своем посте:
распространять только один пакет (или только один модуль) на проект и использовать имя пакета (или модуля) как имя проекта.
Это позволяет избежать возможной путаницы между именем проекта и именем распределенного пакета или модуля.
Это делает одинаковое имя.
Это явно: когда вы видите имя проекта, он угадывает имя пакета / модуля и наоборот.
Он также ограничивает неявные столкновения между именами пакетов/модулей. Используя одно имя при регистрации имени проекта в PyPI, вы также выполните базовую проверку доступности имени пакета / модуля.
важно отметить, что этот PEP все еще находится в "отложенном" состоянии, что означает, что он имеет не был ратифицирован редакторами ОПТОСОЗ и заблокирован другим предложением (в частности, реализацией обновления синтаксиса метаданных модуля в ОПТОСОЗ 440). Однако за время, прошедшее после первоначального предложения 423 года, не было разработано ни одного конкурирующего стандарта, и большая часть его содержания представляется довольно бесспорной, поэтому я ожидаю, что он будет принят в будущем без слишком больших изменений.
нет никаких рекомендаций, которые я знаю, которые требуют, чтобы имя вашего проекта соответствовало установленному пакету или модулю. Есть отложенный проект ОПТОСОЗ-423 соглашения об именах и рецепты, связанные с упаковкой, но это фактически оставлено (a в ожидании обновления никогда не был применен).
вы говорите, что посмотрели, но вы, вероятно, пропустили некоторые существующие примеры, где имя проекта и пакет не содержат матч:
на проект BeautifulSoup использует
beautifulsoup4
для имени проекта на PyPI, который устанавливает пакетbs4
.на
dateutil
пакет Python доступен на PyPI какpython-dateutil
. Префиксация имен проектов PyPI сpython-
достаточно распространен, я насчитал 1512 таких пакетов на PyPI сегодня.на Viivakoodi проект является вилкой pyBarcode. Их
viivakoodi
проект PyPI установкаbarcode
пакетаsite-packages
. Еще один такой проект fork -подушка, который является вилкой библиотеки изображений Python. Он доступен на PyPI под именем но пакет устанавливает .
тем не менее, лично я предпочитаю его для имени проекта PyPI и пакета, содержащегося в соответствии; Это уменьшает путаницу. Самый заметное исключение для Project forks, где целью является сохранение старого имени пакета для облегчения миграции.
С PEP 8:
Основополагающим Принципом
имена, которые видны пользователю как общедоступные части API, должны следовать соглашениям, которые отражают использование, а не реализацию.
имена пакетов и модулей
модули должны иметь короткие имена в нижнем регистре. Подчеркивания можно использовать в имени модуля, если это улучшает читаемость. Пакеты Python должны иметь короткие, все-строчные имена, хотя использование подчеркиваний не рекомендуется.
единственное, что здесь, похоже, решает ваш вопрос, - это то, что подчеркивания в именах пакетов не поощряются.
в настоящее время существуют другие PEPs в работах для устранения некоторых несоответствий в упаковке Python в целом (426, 423), но пока они не разрешены, я бы пошел с тем, что имеет наибольший смысл под PEP 20. Если super
достаточно, чтобы передать то, что импортируется, тогда я был бы склонен пойти с этим (хотя, если это так, почему бы не использовать его для имени пакета PyPi?).
Я не думаю, что Конвенция диктует им быть одинаковыми, но на практике они оба пытаются достичь одной и той же цели, таким образом, в большинстве случаев оказываются одинаковыми.
у вас есть правильная идея. конвенция, которую я видел, используется чаще всего, и это хорошо сработало для меня:
/superduper
/superduper
__init__.py
code.py
/.git
setup.py
README.rst
вы обнаружите, что большинство разработчиков python предпочитают все строчные буквы без специальных символов для имен модулей (setuptools, pexpect, matplotlib и т. д.).
ваша папка проекта верхнего уровня также должна соответствовать имени репозитория git, чтобы она не менялась при клонировании git.
мой лучший совет, это взглянуть на источник, из хорошие проектов, а также имитировать то, что они сделали.