организация модуля python

#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