По мере роста количества модулей становится трудно их отслеживать. Это становиться заметно, если они имеют похожие имена или функциональность и хотелось бы иметь какое то средство их группировки и организации.
Пакеты позволяют иерархически структурировать пространство имен модуля с использованием точечной нотации. Точно так же, как модули помогают избежать коллизий между именами глобальных переменных, пакеты помогают избежать коллизий между именами модулей.
Можно рассматривать пакеты как каталоги в файловой системе, а модули как файлы в каталогах, но не надо воспринимать эту аналогию слишком буквально, поскольку пакеты и модули не обязательно должны происходить из файловой системы. Для целей обучения будем использовать эту удобную аналогию каталогов и файлов. Как и каталоги файловой системы, пакеты организованы иерархически, и сами пакеты могут содержать вложенные пакеты, а также обычные модули.
Важно помнить, что все пакеты являются модулями, но не все модули являются пакетами. Или, другими словами, пакеты - это просто особый вид модуля. В частности, любой модуль, содержащий атрибут __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'
Чтобы фактически импортировать модули или их содержимое, вам нужно использовать одну из форм, показанных выше.