Я использую Python для работы в Maya, и в течение нескольких месяцев я начал создавать множество различных модулей, которые формируют различные инструменты.
Сначала я просто складывал все внутри одного корневого пакета, состоящего из огромных модулей, содержащих немного функций, классов и т.д., В зависимости от ситуации, с отдельным "ядровым" модулем, содержащим все общие вещи.
root (package)
animation.py (module)
audio.py (module)
modelling.py (module)
rigging.py (module)
library.py (module)
core.py (module)
Недавно я видел несколько примеров другого подхода, который состоит в создании пакетов для каждой области макросов и разбиении кода внутри них на различные меньшие модули. Что-то похожее на это.
root (package)
animation (package)
__init__.py (module)
core.py (module)
utils.py (module)
ui.py (module
bar.py (module)
audio (package)
__init__.py (module)
core.py (module)
utils.py (module)
ui.py (module
foo.py (module)
rigging (package)
__init__.py (module)
core.py (module)
utils.py (module)
ui.py (module
foo.py (module)
etc
Внутри модулей __init__.py другие модули импортируются таким образом.
from core import *
from utils import *
from ui import Window
from foo import Foo
Так что, когда весь пакет импортируется, результат довольно схож с тем, что все внутри одного огромного модуля содержит все. В конце, чтобы получить доступ к функциям каждого модуля/пакета, этот код должен работать для обеих структур.
import animation
animation.Foo()
Мой вопрос:
Какой из этих методов более логичен для организации кода? С одной стороны структура "пакета" выглядит более организованной, но она дает мне больше циклических импортных и перезагружаемых проблем (это может быть просто признаком моих плохих привычек импорта). С другой стороны, классические модули начинают становиться довольно трудными для навигации из-за количества вещей, которые я вкладываю в них.
Прежде всего, добро пожаловать в StackOverflow! Во-вторых, это определенно вопрос предпочтения, но вам следует избегать синтаксиса from package import *
поскольку он сильно загрязняет пространство имен, особенно если у вас много функций.
Что касается вашего вопроса, если вы посмотрите на многие стандартные пакеты библиотеки в Python, они состоят из корневой папки с примерно 5-6 py файлами. Теперь это может быть не самая красивая вещь, но она не дезорганизована и позволяет легко импортировать.
Для вашей ситуации, поскольку у вас много файлов для рассмотрения, вы должны сначала подумать: "Являются ли мои файлы Python слишком маленькими?" Исходя из фона Java, я понимаю, что диск содержит множество файлов, каждый из которых содержит небольшой бит. Старайтесь делать подобные вещи с такими вещами, которые имеют смысл, не имея слишком большого количества файлов.
Если все эти модули связаны каким-то основным приложением, то вам следует как можно больше отделить модули, поэтому вам нужно импортировать как можно меньше элементов из каждого модуля. Если вы пишете библиотеку, вы должны 100% попытаться сделать модули максимально возможными, если только вы не планируете отправлять их как одну большую библиотеку. При отправке в виде одной библиотеки вы можете в принципе организовать ее, как хотите, до тех пор, пока она имеет смысл и работает.
В принципе:
from package import *
не очень хорош? Есть ли ситуации, когда это может быть полезно? Должен ли я импортировать каждый модуль с его собственным именем или с максимальным использованием import module as mod
?
from package import *
просто импортируются имена подмодулей и ничего больше.