Сообщить об ошибке.

Пакеты модулей в Python

По мере роста количества модулей становится трудно их отслеживать. Это становиться заметно, если они имеют похожие имена или функциональность и хотелось бы иметь какое то средство их группировки и организации.

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

Можно рассматривать пакеты как каталоги в файловой системе, а модули как файлы в каталогах, но не надо воспринимать эту аналогию слишком буквально, поскольку пакеты и модули не обязательно должны происходить из файловой системы. Для целей обучения будем использовать эту удобную аналогию каталогов и файлов. Как и каталоги файловой системы, пакеты организованы иерархически, и сами пакеты могут содержать вложенные пакеты, а также обычные модули.

Важно помнить, что все пакеты являются модулями, но не все модули являются пакетами. Или, другими словами, пакеты - это просто особый вид модуля. В частности, любой модуль, содержащий атрибут __path__ считается пакетом.

Например есть каталог pkg с двумя модулями mod1.py и mod2.py. Допустим, что содержимое модулей имеет следующий код:

mod1.py:

def foo():
    print('Модуль 1, функция foo()')

mod2.py:

def bar():
    print('Модуль 2, функция bar()')

Если каталог pkg находится в одном из каталогов, содержащихся в выводе sys.path, то можно импортировать приведенные выше модули, использовав точечную нотацию pkg.mod1, pkg.mod2.

Использование конструкции импорта import <module_name>[, <module_name> ...]:

>>> import pkg.mod1, pkg.mod2
>>> pkg.mod1.foo()
# Модуль 1, функция foo()
>>> x = pkg.mod2.bar()
>>> x
# Модуль 2, функция bar()

Использование конструкции импорта from <module_name> import <name(s)>:

>>> from pkg.mod1 import foo
>>> foo()
# Модуль 1, функция foo()

Использование конструкции импорта from <module_name> import <name> as <alt_name>:

>>> from pkg.mod2 import bar as func_bar
>>> x = func_bar()
>>> x
# Модуль 2, функция bar()

Модули пакета можно импортировать и так - from package import module:

>>> from pkg import mod1
>>> mod1.foo()
# Модуль 1, функция foo()

>>> from pkg import mod2 as two_mod
>>> two_mod.bar()
# Модуль 2, функция bar()

Технически также можно импортировать пакет import pkg. Это синтаксически правильный импорт Python, но он не помещает ни один из модулей пакета pkg в локальное пространство имен скрипта:

>>> import pkg
>>> pkg
# <module 'pkg' ... >

>>> pkg.mod1
# Traceback (most recent call last):
# ...
# AttributeError: module 'pkg' has no attribute 'mod1'

>>> pkg.mod2.bar()
# Traceback (most recent call last):
# ...
# AttributeError: module 'pkg' has no attribute 'mod2'

Чтобы фактически импортировать модули или их содержимое, вам нужно использовать одну из форм, показанных выше.