Лучший способ сохранить организованные модули Python

1

Я использую 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()

Мой вопрос:

Какой из этих методов более логичен для организации кода? С одной стороны структура "пакета" выглядит более организованной, но она дает мне больше циклических импортных и перезагружаемых проблем (это может быть просто признаком моих плохих привычек импорта). С другой стороны, классические модули начинают становиться довольно трудными для навигации из-за количества вещей, которые я вкладываю в них.

  • 1
    Это всего лишь предпочтение, люди могли тысячелетиями спорить о положительных и отрицательных сторонах любого стиля.
  • 0
    Я понимаю. Нормально ли сталкиваться с большим количеством циклических импортов при использовании второго метода? Мне это нравится больше, но я особенно борюсь, когда объявляю классы в разных модулях и пытаюсь вызывать их в других пакетах. Я получаю циклы в импорте, и я вынужден помещать импорт в функции или классы, что не кажется хорошей практикой.
Показать ещё 2 комментария
Теги:
module
structure

1 ответ

0
Лучший ответ

Прежде всего, добро пожаловать в StackOverflow! Во-вторых, это определенно вопрос предпочтения, но вам следует избегать синтаксиса from package import * поскольку он сильно загрязняет пространство имен, особенно если у вас много функций.

Что касается вашего вопроса, если вы посмотрите на многие стандартные пакеты библиотеки в Python, они состоят из корневой папки с примерно 5-6 py файлами. Теперь это может быть не самая красивая вещь, но она не дезорганизована и позволяет легко импортировать.

Для вашей ситуации, поскольку у вас много файлов для рассмотрения, вы должны сначала подумать: "Являются ли мои файлы Python слишком маленькими?" Исходя из фона Java, я понимаю, что диск содержит множество файлов, каждый из которых содержит небольшой бит. Старайтесь делать подобные вещи с такими вещами, которые имеют смысл, не имея слишком большого количества файлов.

Если все эти модули связаны каким-то основным приложением, то вам следует как можно больше отделить модули, поэтому вам нужно импортировать как можно меньше элементов из каждого модуля. Если вы пишете библиотеку, вы должны 100% попытаться сделать модули максимально возможными, если только вы не планируете отправлять их как одну большую библиотеку. При отправке в виде одной библиотеки вы можете в принципе организовать ее, как хотите, до тех пор, пока она имеет смысл и работает.

В принципе:

  • Создайте дополнительный модуль для каждого, и вы получите красивость и организацию, но импортируете ад
  • Имейте 5-6 больших файлов и импорта, но файлы требуют времени для навигации и поиска того, что вам нужно использовать/модифицировать
  • 0
    Не могли бы вы рассказать о причине, по которой синтаксис from package import * не очень хорош? Есть ли ситуации, когда это может быть полезно? Должен ли я импортировать каждый модуль с его собственным именем или с максимальным использованием import module as mod ?
  • 0
    stackoverflow.com/questions/2386714/why-is-import-bad Основная причина заключается в том, что все переменные, функции и классы загрязняют пространство имен вашего файла. Если вы привыкли делать это, в конечном итоге произойдет столкновение имен. Тем не менее, есть библиотеки, которые разделены на подмодули, то есть from package import * просто импортируются имена подмодулей и ничего больше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню