2015-03-23 2 views
3

В последнее время я пишу совсем немного кода Python, и я изо всех сил пытаюсь понять, как правильно структурировать мой модуль, чтобы обеспечить простой импорт.Как структурировать модули, чтобы избежать таких вещей, как «import module.module.module»

У меня есть модуль структурирована следующим образом:

/module 
    /submod_1 
     submod_1_class.py 
    /submod_2 
     submod_2_class.py 

но я нахожу это невероятно раздражает придется импортировать класс в submod_1_class.py с:

from module.submod_1.submod_1_class import class 

То, что я предпочел бы, чтобы иметь возможность тип:

from module import class 

Я знаю, что должен быть способ сделать это повторно элегантный, и я просмотрел папку site-packages и просмотрел популярные модули, как numpy, но я не мог понять, как, например:

import numpy 
a = numpy.array([1,2,3,4,5]) 

может быть использован при определении numpy массива объекты находятся глубоко внутри нескольких подпапок пакета numpy.

+5

Добавьте некоторые '__init __. Py' файлы, чтобы определить, что должно быть доступно из каждого модуля. Например, если у вас есть один в '/ module', который включает' from submod_1.submod_1_class import class', то извне модуль вы * можете * 'из класса импорта модуля. Например, чтобы придерживаться 'numpy', [эта строка] (https://github.com/numpy/numpy/blob/master/numpy/__init__.py#L192) означает, что все, что определено в [этом файле] (https : //github.com/numpy/numpy/blob/master/numpy/core/__init__.py) можно импортировать прямо из 'numpy'. – jonrsharpe

+2

@jonrsharpe Пожалуйста, положите это в ответ, чтобы вы могли получить очки за верхнюю ставку, которую я хочу вам дать. – Shashank

ответ

2

Вы можете использовать __init__.py файлы, чтобы определить, что может быть import ed из данного модуля. Очень простое дополнение к вашей структуре, например, составило бы Class от submod_1_class, так что внешние пользователи могут просто from module import Class.

/module 
    __init__.py 
     from submod_1 import Class 
    /submod_1 
     __init__.py 
      from submod_1_class import Class 
     submod_1_class.py 
    /submod_2 
     submod_2_class.py 

В numpy, например, верхний уровень __init__.py содержит a line, который читает:

from .core import * 

Это означает, что все, что определенно в /core/__init__.py доступно извне непосредственно в numpy пространства имен, даже если он может на самом деле глубоко погружаться в сложную структуру.