#python #python-import
#python #python-импорт
Вопрос:
Я пишу библиотеку python, которая создает резервные копии и упорядочивает научные данные. давайте назовем это dataapp
Я хотел бы разместить свой каталог следующим образом:
core/
operations/
cli_interface.py
ядро содержит все классы данных и класс для хранилища данных, и весь код является автономным, без каких-либо зависимостей. операции содержат все действия, такие как сохранение, обновление, резервное копирование данных, однако операции зависят от ядра. ядро не является дочерним элементом операций и должно иметь возможность самостоятельного использования.
Однако импорт кода из ядра в операции кажется уродливым, потому что мне пришлось бы импортировать из относительных путей и от родителей.
Другим вариантом импорта является глобальная установка dataapp
на компьютере, в этом случае операции могут легко импортироваться из ядра.
Мой вопрос: рекомендуется ли вышеуказанное, или есть лучший способ изложить мой код?
Ответ №1:
Попробуйте этот макет:
core/
__init__.py
functions.py
operations/
__init__.py
actions.py
test.py
Примечание: __init__.py
файлы, это просто пустые файлы для определения пакета с именем, совпадающим с именем каталога.
Где functions.py
с определениями основных функций:
def core_function():
print "core function"
Модуль actions.py
будет иметь такую связь с core
:
from core import functions
def simple_action():
functions.core_function()
В вашем приложении test.py
вы можете использовать его следующим образом:
from core import functions
from operations import actions
functions.core_function()
actions.simple_action()
Также обратите внимание: core
operations
на пакеты и ссылается весь путь, а не относительный, т. Е. Если бы у вас была lab.sci.core
структура, вы бы использовали from lab.sci.core
и from lab.sci.operations
импортировали команды в свое test.py
приложение и actions.py
модуль.
Комментарии:
1. это решает мою проблему…. Сейчас я использую
from lab.core import functions
в модуле operations. Моя ошибка заключалась в попытке использоватьfrom core import functions
. Но теперь вы прояснили это для меня.
Ответ №2:
Настройка, которую вы набросали, в полном порядке. Если бы каждому модулю было разрешено импортировать только из его собственных подмодулей (строгая древовидная структура), вы никогда не смогли бы обмениваться кодом между модулями. Аккуратные структуры модулей представляют собой направленные ациклические графы (без взаимного импорта), не обязательно деревья.
Комментарии:
1. как бы вы порекомендовали мне это сделать, установив приложение глобально и импортировав или используя относительные пути?
2. @EoinMurray что вы подразумеваете под относительными путями?
3. Мне нужно поместить sys.path.append( <путь к ядру> ) в операции. Я не понимаю, как я могу импортировать естественным образом.
4. @EoinMurray В руководстве по Python объясняется, как настраивать пакеты. Изменение
sys.path
кода модуля — это запах кода.
Ответ №3:
Как насчет этого:
cli_interface.py
operations/
core
таким образом, ядро должно быть дочерним элементом operation, потому что core — это данные, которые будут использоваться только модулем operations.
Комментарии:
1. нет, возможно, я не был ясен … ядро не является дочерним элементом только операций. Должно быть разрешено использовать его самостоятельно. Я обновлю вопрос, чтобы отразить это.
2. @EoinMurray, если это так, то лучшим решением будет простая структура.
Ответ №4:
В вашей структуре нет ничего плохого. Но если вы хотите быть более подробным в импорте, это тоже работает:
cli_interface.py
dataapp/
core/
operations/
Тогда вы бы сделали
from dataapp import core