Типичные соглашения об именовании для каталогов Python в пакетах

#python #directory #naming-conventions

#python #каталог #соглашения об именовании

Вопрос:

Вопрос
Я хотел бы знать, существует ли стандартное соглашение об именовании каталогов Python, которые планируется импортировать как модуль. Это означает, что каталог содержит пустое __init__.py

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

   drivers
      prologix  
        - __init__.py
        - driver_a.py
        - driver_b.py
      visa
        - __init__.py  
        - driver_a.py
        - driver_b.py
    __init__.py
    ringout.py <-- simple file to ring-out the drivers  
  

Хотя это отлично работало при вызове драйверов prologix, я столкнулся с проблемой при попытке импортировать мои драйверы visa, а также модуль PyVISA ‘visa’. Диагностировать проблему было очень просто, но исправление переименования папки моего драйвера visa в ‘visa_dir’ затрудняет чтение кода (IMO).

 import drivers.visa  
  

против

 import drivers.visa_dir  
  

Есть ли лучший способ справиться с этим?

Ответ №1:

Пространство имен каждого модуля уникально, поэтому, даже если у вас есть два названных модуля visa , пока вы избегаете импортировать их в одно пространство имен с одинаковым именем, у вас не возникнет никаких проблем. Я склонен предпочитать абсолютный импорт:

 import drivers.visa
import pyVisa.visa
  

Или вы могли бы также использовать as :

 from drivers import visa
from pyVisa import visa as pyvisa
  

…и т.д. Просто будьте осторожны при импорте вещей. Я бы предпочел (как конечный пользователь), чтобы вы логически структурировали свои модули в своем пакете и не беспокоились о том, чтобы предварительно переделать их для меня.

Комментарии:

1. Чтобы добавить к этому, смотрите это сообщение в блоге и PEP 221 .

2. 1 для абсолютного импорта, я действительно не думал об этом. Это покажет мою новизну в Python, но как насчет встроенных модулей? Есть ли аналогичный способ импортировать их таким же образом? Возьмем в качестве примера математику (одну из наиболее общих, которые я смог придумать).

3. Конечно, вы можете использовать те же приемы импорта в стандартной библиотеке.

4. В случае использования из X импортируйте математику. Что такое ‘X’ ? 🙂

5. Пакет или модуль, доступный в вашем PYTHONPATH как X . Если у вас еще нет math в вашем пространстве имен, у вас не возникнет никаких проблем. Вот еще одна статья, которую стоит посмотреть: stereoplex.com/blog/understanding-imports-and-pythonpath