#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