Документация Python неофициальный перевод

modules.md

392 строк · 38.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/tutorial/modules.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 6. Модули89Если выйти из интерпретатора Python и войти в него снова, все созданные определения (функции и переменные) теряются. Поэтому для написания более длинной программы лучше использовать текстовый редактор для подготовки входных данных для интерпретатора и запускать его с этим файлом в качестве входных данных. Это называется созданием *скрипта*. По мере роста программы может потребоваться разбить её на несколько файлов для упрощения сопровождения. Также может пригодиться удобная функция, написанная для нескольких программ, без копирования её определения в каждую из них.1011Для поддержки этого в Python есть способ помещать определения в файл и использовать их в скрипте или в интерактивном сеансе интерпретатора. Такой файл называется *модулем*; определения из модуля можно *импортировать* в другие модули или в *главный* модуль (набор переменных, доступных в скрипте, выполняемом на верхнем уровне, и в режиме калькулятора).1213Модуль – это файл, содержащий определения и инструкции Python. Имя файла – это имя модуля с добавленным суффиксом `.py`. Внутри модуля имя модуля (в виде строки) доступно как значение глобальной переменной `__name__`. Например, с помощью любимого текстового редактора создайте файл с именем `fibo.py` в текущем каталоге со следующим содержимым:1415```python16# Модуль чисел Фибоначчи1718def fib(n):    # вывести ряд Фибоначчи до n19    a, b = 0, 120    while b < n:21        print b,22        a, b = b, a+b2324def fib2(n):   # возвращает ряд Фибоначчи до n25    result = []26    a, b = 0, 127    while b < n:28        result.append(b)29        a, b = b, a+b30    return result31```3233Теперь войдите в интерпретатор Python и импортируйте этот модуль с помощью следующей команды:3435```python36>>> import fibo37```3839Это не вносит имена функций, определённых в `fibo`, непосредственно в текущую таблицу символов; оно вносит только имя модуля `fibo`. Используя имя модуля, можно обращаться к функциям:4041```python42>>> fibo.fib(1000)431 1 2 3 5 8 13 21 34 55 89 144 233 377 610 98744>>> fibo.fib2(100)45[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]46>>> fibo.__name__47'fibo'48```4950Если вы намерены часто использовать функцию, можно присвоить её локальному имени:5152```python53>>> fib = fibo.fib54>>> fib(500)551 1 2 3 5 8 13 21 34 55 89 144 233 37756```5758## 6.1. Подробнее о модулях5960Модуль может содержать исполняемые инструкции, а также определения функций. Эти инструкции предназначены для инициализации модуля. Они выполняются только при *первом* обнаружении имени модуля в инструкции импорта. [1](https://python-all.ru/2.7/tutorial/modules.html#id2) (Они также запускаются, если файл выполняется как скрипт.)6162Каждый модуль имеет собственную приватную таблицу символов, которая используется как глобальная таблица символов всеми функциями, определёнными в модуле. Таким образом, автор модуля может использовать глобальные переменные в модуле, не опасаясь случайных конфликтов с глобальными переменными пользователя. С другой стороны, если вы знаете, что делаете, можно обращаться к глобальным переменным модуля с помощью той же нотации, что используется для обращения к его функциям, `modname.itemname`.6364Модули могут импортировать другие модули. Принято, но не обязательно, помещать все инструкции [`import`](https://python-all.ru/2.7/reference/simple_stmts.html#import) в начале модуля (или сценария, если уж на то пошло). Имена импортированных модулей помещаются в глобальную таблицу символов импортирующего модуля.6566Существует вариант инструкции [`import`](https://python-all.ru/2.7/reference/simple_stmts.html#import), которая импортирует имена из модуля непосредственно в таблицу символов импортирующего модуля. Например:6768```python69>>> from fibo import fib, fib270>>> fib(500)711 1 2 3 5 8 13 21 34 55 89 144 233 37772```7374При этом имя модуля, из которого берутся импорты, не вносится в локальную таблицу символов (поэтому в примере `fibo` не определён).7576Существует даже вариант импорта всех имён, определённых в модуле:7778```python79>>> from fibo import *80>>> fib(500)811 1 2 3 5 8 13 21 34 55 89 144 233 37782```8384Это импортирует все имена, кроме начинающихся с подчёркивания (`_`).8586Обратите внимание, что в целом практика импортирования `*` из модуля или пакета не одобряется, поскольку часто приводит к плохо читаемому коду. Однако её можно использовать, чтобы сэкономить время набора в интерактивных сеансах.8788Если за именем модуля следует [`as`](https://python-all.ru/2.7/reference/compound_stmts.html#as), то имя, следующее за [`as`](https://python-all.ru/2.7/reference/compound_stmts.html#as), привязывается непосредственно к импортированному модулю.8990```python91>>> import fibo as fib92>>> fib.fib(500)930 1 1 2 3 5 8 13 21 34 55 89 144 233 37794```9596Это по сути импортирует модуль так же, как и `import fibo`, с единственным отличием: он становится доступен как `fib`.9798Его также можно использовать при применении [`from`](https://python-all.ru/2.7/reference/simple_stmts.html#from) с аналогичными эффектами:99100```python101>>> from fibo import fib as fibonacci102>>> fibonacci(500)1030 1 1 2 3 5 8 13 21 34 55 89 144 233 377104```105106> **Примечание**107>108> По соображениям эффективности каждый модуль импортируется только один раз за сеанс интерпретатора. Поэтому при изменении модулей необходимо перезапустить интерпретатор – или, если требуется протестировать в интерактивном режиме только один модуль, используйте [`reload()`](https://python-all.ru/2.7/library/functions.html#reload), например `reload(modulename)`.109110### 6.1.1. Выполнение модулей как скриптов111112Когда вы запускаете модуль Python с113114```python115python fibo.py <arguments>116```117118код в модуле будет выполнен, как если бы вы его импортировали, но с `__name__`, установленным в `"__main__"`. Это означает, что, добавив этот код в конец модуля:119120```python121if __name__ == "__main__":122    import sys123    fib(int(sys.argv[1]))124```125126можно сделать файл пригодным для использования как в качестве скрипта, так и импортируемого модуля, поскольку код, разбирающий командную строку, выполняется только при запуске модуля как «главного» файла:127128```console129$ python fibo.py 501301 1 2 3 5 8 13 21 34131```132133Если модуль импортируется, этот код не выполняется:134135```python136>>> import fibo137>>>138```139140Это часто используется либо для предоставления удобного пользовательского интерфейса модуля, либо для целей тестирования (запуск модуля как скрипта выполняет тестовый набор).141142### 6.1.2. Путь поиска модулей143144Когда импортируется модуль с именем `spam`, интерпретатор сначала ищет встроенный модуль с таким именем. Если он не найден, то затем ищется файл с именем `spam.py` в списке каталогов, заданном переменной [`sys.path`](https://python-all.ru/2.7/library/sys.html#sys.path). [`sys.path`](https://python-all.ru/2.7/library/sys.html#sys.path) инициализируется из следующих источников:145146- каталог, содержащий входной скрипт (или текущий каталог).147- [`PYTHONPATH`](https://python-all.ru/2.7/using/cmdline.html#envvar-PYTHONPATH) (список имён каталогов с тем же синтаксисом, что и переменная оболочки `PATH`).148- зависящий от установки путь по умолчанию.149150После инициализации программы Python могут изменять [`sys.path`](https://python-all.ru/2.7/library/sys.html#sys.path). Каталог, содержащий выполняемый скрипт, помещается в начало пути поиска, перед путём стандартной библиотеки. Это означает, что скрипты из этого каталога будут загружаться вместо модулей с теми же именами из библиотечного каталога. Если замена не предполагалась, это является ошибкой. Дополнительную информацию см. в разделе [Стандартные модули](https://python-all.ru/2.7/tutorial/modules.html#tut-standardmodules).151152### 6.1.3. «Скомпилированные» файлы Python153154Для значительного ускорения запуска коротких программ, использующих много стандартных модулей, если файл с именем `spam.pyc` существует в каталоге, где находится `spam.py`, то считается, что он содержит уже «откомпилированную в байт-код» версию модуля `spam`. Время изменения файла `spam.py`, использованного для создания `spam.pyc`, записывается в `spam.pyc`, и файл `.pyc` игнорируется, если они не совпадают.155156Обычно не требуется ничего делать для создания файла `spam.pyc`. Всякий раз, когда `spam.py` успешно компилируется, предпринимается попытка записать скомпилированную версию в `spam.pyc`. Сбой при этой попытке не является ошибкой; если по какой-либо причине файл не был записан полностью, полученный файл `spam.pyc` будет признан недействительным и впоследствии проигнорирован. Содержимое файла `spam.pyc` не зависит от платформы, поэтому каталог модулей Python может быть общим для машин с разными архитектурами.157158Несколько советов для экспертов:159160- Когда интерпретатор Python вызывается с флагом [`-O`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-o), генерируется оптимизированный код, который сохраняется в файлах `.pyo`. Оптимизатор в настоящее время мало помогает; он только удаляет операторы [`assert`](https://python-all.ru/2.7/reference/simple_stmts.html#assert). При использовании [`-O`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-o) *весь* [байт-код](https://python-all.ru/2.7/glossary.html#term-bytecode) оптимизируется; файлы `.pyc` игнорируются, а файлы `.py` компилируются в оптимизированный байт-код.161- Передача двух флагов [`-O`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-o) интерпретатору Python ([`-OO`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-oo)) заставит компилятор байт-кода выполнять оптимизации, которые в редких случаях могут привести к неправильной работе программ. В настоящее время из байт-кода удаляются только строки `__doc__`, что приводит к более компактным файлам `.pyo`. Поскольку некоторые программы могут полагаться на наличие этих строк, следует использовать эту опцию только при понимании того, что делается.162- Программа выполняется не быстрее при чтении из файла `.pyc` или `.pyo`, чем при чтении из файла `.py`; единственное, что быстрее в файлах `.pyc` или `.pyo` – это скорость их загрузки.163- Когда скрипт запускается указанием его имени в командной строке, байт-код для скрипта никогда не записывается в файл `.pyc` или `.pyo`. Таким образом, время запуска скрипта можно уменьшить, переместив большую часть его кода в модуль и создав небольшой загрузочный скрипт, который импортирует этот модуль. Также можно указать файл `.pyc` или `.pyo` непосредственно в командной строке.164- Можно иметь файл с именем `spam.pyc` (или `spam.pyo` при использовании [`-O`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-o)) без файла `spam.py` для того же модуля. Это можно использовать для распространения библиотеки кода Python в форме, которую относительно сложно декомпилировать.165- Модуль [`compileall`](https://python-all.ru/2.7/library/compileall.html#module-compileall) может создавать файлы `.pyc` (или файлы `.pyo` при использовании [`-O`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-o)) для всех модулей в каталоге.166167## 6.2. Стандартные модули168169Python поставляется с библиотекой стандартных модулей, описанной в отдельном документе – «Справочнике по библиотеке Python» (далее – «Справочник по библиотеке»). Некоторые модули встроены в интерпретатор; они предоставляют доступ к операциям, не входящим в ядро языка, но тем не менее встроенным, либо для эффективности, либо для доступа к примитивам операционной системы, таким как системные вызовы. Набор таких модулей является опцией конфигурации, которая также зависит от базовой платформы. Например, модуль `winreg` предоставляется только в Windows. Особого внимания заслуживает модуль [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys), встроенный в каждый интерпретатор Python. Переменные `sys.ps1` и `sys.ps2` определяют строки, используемые в качестве основного и дополнительного приглашений:170171```python172>>> import sys173>>> sys.ps1174'>>> '175>>> sys.ps2176'... '177>>> sys.ps1 = 'C> '178C> print 'Yuck!'179Yuck!180C>181```182183Эти две переменные определены только в том случае, если интерпретатор находится в интерактивном режиме.184185Переменная `sys.path` – это список строк, определяющий путь поиска модулей интерпретатора. Она инициализируется значением по умолчанию, взятым из переменной окружения [`PYTHONPATH`](https://python-all.ru/2.7/using/cmdline.html#envvar-PYTHONPATH), или встроенным значением по умолчанию, если [`PYTHONPATH`](https://python-all.ru/2.7/using/cmdline.html#envvar-PYTHONPATH) не задана. Её можно изменять с помощью стандартных операций со списками:186187```python188>>> import sys189>>> sys.path.append('/ufs/guido/lib/python')190```191192## 6.3. Функция [`dir()`](https://python-all.ru/2.7/library/functions.html#dir)193194Встроенная функция [`dir()`](https://python-all.ru/2.7/library/functions.html#dir) используется для выяснения, какие имена определяет модуль. Она возвращает отсортированный список строк:195196```python197>>> import fibo, sys198>>> dir(fibo)199['__name__', 'fib', 'fib2']200>>> dir(sys)  201['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__',202 '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache',203 '_current_frames', '_getframe', '_mercurial', 'api_version', 'argv',204 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',205 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info',206 'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix',207 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',208 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',209 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',210 'getrefcount', 'getsizeof', 'gettotalrefcount', 'gettrace', 'hexversion',211 'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules',212 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',213 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile',214 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion',215 'version', 'version_info', 'warnoptions']216```217218Без аргументов [`dir()`](https://python-all.ru/2.7/library/functions.html#dir) выводит имена, определённые на данный момент:219220```python221>>> a = [1, 2, 3, 4, 5]222>>> import fibo223>>> fib = fibo.fib224>>> dir()225['__builtins__', '__name__', '__package__', 'a', 'fib', 'fibo', 'sys']226```227228Обратите внимание, что она перечисляет имена всех типов: переменные, модули, функции и т.д.229230[`dir()`](https://python-all.ru/2.7/library/functions.html#dir) не перечисляет имена встроенных функций и переменных. Если нужен их список, они определены в стандартном модуле [`__builtin__`](https://python-all.ru/2.7/library/__builtin__.html#module-__builtin__):231232```python233>>> import __builtin__234>>> dir(__builtin__)  235['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',236 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError',237 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError',238 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning',239 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',240 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented',241 'NotImplementedError', 'OSError', 'OverflowError',242 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError',243 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',244 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True',245 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',246 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',247 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning',248 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__',249 '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring',250 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr',251 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright',252 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval',253 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset',254 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input',255 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license',256 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next',257 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit',258 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round',259 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',260 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']261```262263## 6.4. Пакеты264265Пакеты – это способ структурирования пространства имён модулей Python с помощью «точечных имён модулей». Например, имя модуля `A.B` обозначает подмодуль с именем `B` в пакете с именем `A`. Подобно тому, как использование модулей избавляет авторов разных модулей от необходимости беспокоиться о глобальных переменных друг друга, использование точечных имён модулей избавляет авторов многомодульных пакетов (таких как NumPy или Pillow) от необходимости беспокоиться об именах модулей друг друга.266267Предположим, вы хотите разработать набор модулей («пакет») для единообразной работы со звуковыми файлами и звуковыми данными. Существует множество различных форматов звуковых файлов (обычно распознаваемых по расширению, например: `.wav`, `.aiff`, `.au`), поэтому может потребоваться создать и поддерживать растущую коллекцию модулей для преобразования между различными форматами. Кроме того, со звуковыми данными можно выполнять множество различных операций (таких как микширование, добавление эха, применение эквалайзера, создание искусственного стереоэффекта), поэтому в дополнение придётся писать бесконечный поток модулей для выполнения этих операций. Вот возможная структура вашего пакета (в виде иерархической файловой системы):268269```text270sound/                          Top-level package271      __init__.py               Initialize the sound package272      formats/                  Subpackage for file format conversions273              __init__.py274              wavread.py275              wavwrite.py276              aiffread.py277              aiffwrite.py278              auread.py279              auwrite.py280              ...281      effects/                  Subpackage for sound effects282              __init__.py283              echo.py284              surround.py285              reverse.py286              ...287      filters/                  Subpackage for filters288              __init__.py289              equalizer.py290              vocoder.py291              karaoke.py292              ...293```294295При импорте пакета Python просматривает каталоги в `sys.path` в поисках подкаталога пакета.296297Файлы `__init__.py` необходимы, чтобы Python обрабатывал каталоги как содержащие пакеты; это сделано для предотвращения случайного скрытия каталогами с распространёнными именами, такими как `string`, действительных модулей, которые находятся позже в пути поиска модулей. В простейшем случае `__init__.py` может быть просто пустым файлом, но он также может выполнять код инициализации пакета или устанавливать переменную `__all__`, описанную далее.298299Пользователи пакета могут импортировать отдельные модули из пакета, например:300301```python302import sound.effects.echo303```304305Это загружает подмодуль `sound.effects.echo`. На него необходимо ссылаться по полному имени.306307```python308sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)309```310311Альтернативный способ импорта подмодуля:312313```python314from sound.effects import echo315```316317Это также загружает подмодуль `echo` и делает его доступным без префикса пакета, так что его можно использовать следующим образом:318319```python320echo.echofilter(input, output, delay=0.7, atten=4)321```322323Ещё один вариант – импортировать нужную функцию или переменную напрямую:324325```python326from sound.effects.echo import echofilter327```328329Опять же, это загружает подмодуль `echo`, но теперь его функция `echofilter()` становится доступна напрямую:330331```python332echofilter(input, output, delay=0.7, atten=4)333```334335Обратите внимание, что при использовании `from package import item` элемент может быть либо подмодулем (или подпакетом) пакета, либо другим именем, определённым в пакете, например функцией, классом или переменной. Инструкция `import` сначала проверяет, определён ли элемент в пакете; если нет, она предполагает, что это модуль, и пытается загрузить его. Если найти его не удаётся, возбуждается исключение [`ImportError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ImportError).336337Напротив, при использовании синтаксиса типа `import item.subitem.subsubitem` каждый элемент, кроме последнего, должен быть пакетом; последний элемент может быть модулем или пакетом, но не может быть классом, функцией или переменной, определённой в предыдущем элементе.338339### 6.4.1. Импорт \* из пакета340341Что происходит, когда пользователь пишет `from sound.effects import *`? В идеале хотелось бы, чтобы это как-то обращалось к файловой системе, находило, какие подмодули присутствуют в пакете, и импортировало их все. Это может занять много времени, а импорт подмодулей может вызвать нежелательные побочные эффекты, которые должны возникать только при явном импорте подмодуля.342343Единственное решение – чтобы автор пакета предоставил явный индекс пакета. Инструкция [`import`](https://python-all.ru/2.7/reference/simple_stmts.html#import) использует следующее соглашение: если в коде `__init__.py` пакета определён список с именем `__all__`, он считается списком имён модулей, которые должны быть импортированы при встрече `from package import *`. Автор пакета должен обновлять этот список при выпуске новой версии пакета. Авторы пакетов также могут решить не поддерживать это, если не видят смысла в импорте \* из своего пакета. Например, файл `sound/effects/__init__.py` может содержать следующий код:344345```python346__all__ = ["echo", "surround", "reverse"]347```348349Это означало бы, что `from sound.effects import *` импортирует три указанных подмодуля пакета `sound`.350351Если `__all__` не определён, инструкция `from sound.effects import *` *не* импортирует все подмодули из пакета `sound.effects` в текущее пространство имён; она только гарантирует, что пакет `sound.effects` был импортирован (возможно, с выполнением кода инициализации в `__init__.py`), а затем импортирует все имена, определённые в пакете. Сюда входят любые имена, определённые (и подмодули, явно загруженные) инструкцией `__init__.py`. Также сюда входят любые подмодули пакета, которые были явно загружены предыдущими инструкциями [`import`](https://python-all.ru/2.7/reference/simple_stmts.html#import). Рассмотрим следующий код:352353```python354import sound.effects.echo355import sound.effects.surround356from sound.effects import *357```358359В этом примере модули `echo` и `surround` импортируются в текущее пространство имён, потому что они определены в пакете `sound.effects` при выполнении инструкции `from...import`. (Это также работает, когда определён `__all__`.)360361Хотя некоторые модули спроектированы так, чтобы экспортировать только имена, соответствующие определённым шаблонам при использовании `import *`, в производственном коде это по-прежнему считается плохой практикой.362363Помните, в использовании `from package import specific_submodule` нет ничего плохого! На самом деле, это рекомендуемая запись, если только импортирующему модулю не требуется использовать подмодули с одинаковыми именами из разных пакетов.364365### 6.4.2. Ссылки внутри пакета366367Подмодули часто должны ссылаться друг на друга. Например, модуль `surround` может использовать модуль `echo`. На самом деле такие ссылки настолько распространены, что оператор [`import`](https://python-all.ru/2.7/reference/simple_stmts.html#import) сначала ищет в содержащем пакете, прежде чем искать в стандартном пути поиска модулей. Таким образом, модуль `surround` может просто использовать `import echo` или `from echo import echofilter`. Если импортируемый модуль не найден в текущем пакете (пакете, подмодулем которого является текущий модуль), оператор [`import`](https://python-all.ru/2.7/reference/simple_stmts.html#import) ищет модуль верхнего уровня с заданным именем.368369Когда пакеты структурированы в подпакеты (как пакет `sound` в примере), можно использовать абсолютные импорты для обращения к подмодулям родственных пакетов. Например, если модулю `sound.filters.vocoder` требуется использовать модуль `echo` из пакета `sound.effects`, он может использовать `from sound.effects import echo`.370371Начиная с Python 2.5, в дополнение к неявным относительным импортам, описанным выше, можно использовать явные относительные импорты с помощью формы оператора import `from module import name`. В этих явных относительных импортах используются начальные точки для указания текущего и родительского пакетов, участвующих в относительном импорте. Например, из модуля `surround` можно написать:372373```python374from . import echo375from .. import formats376from ..filters import equalizer377```378379Обратите внимание, что как явные, так и неявные относительные импорты основаны на имени текущего модуля. Поскольку имя главного модуля всегда `"__main__"`, модули, предназначенные для использования в качестве главного модуля приложения Python, должны всегда использовать абсолютные импорты.380381### 6.4.3. Пакеты в нескольких каталогах382383Пакеты поддерживают ещё один специальный атрибут, `__path__`. Он инициализируется списком, содержащим имя каталога, в котором находится `__init__.py` пакета, до выполнения кода в этом файле. Эту переменную можно изменять; это повлияет на последующий поиск модулей и подпакетов, входящих в пакет.384385Хотя эта возможность требуется нечасто, её можно использовать для расширения набора модулей, доступных в пакете.386387Сноски388389**[1](https://python-all.ru/2.7/tutorial/modules.html#id1)**390391На самом деле определения функций также являются «инструкциями», которые «выполняются»; исполнение определения функции на уровне модуля вносит имя функции в глобальную таблицу символов модуля.392