Python Glossary English

все Python 3Модули и импортпонятие

Пакет и __init__.py

пакеты

Пакет — каталог с модулями, импортируемый как pkg.mod. Файл __init__.py делает каталог обычным пакетом и выполняется при первом импорте пакета.

Синтаксис

pkg/
    __init__.py
    mod.py

import pkg.mod
from pkg import mod
from .mod import name  # внутри пакета

__init__.py выполняется один раз — при первом import pkg или import pkg.mod — и всё, что в нём определено, становится атрибутами pkg; так из пакета «поднимают» удобные имена: from .prices import total. Подмодуль сам не становится атрибутом пакета: после import pkg обращение pkg.mod падает с AttributeError, пока pkg.mod не импортирован явно или из __init__.py. Каталог без __init__.py тоже импортируется — как пакет пространства имён (PEP 420, Python 3.3), у него __file__ равен None; это сделано для пакетов, разбросанных по нескольким каталогам, и легко скрывает опечатку в пути. Файл с именем модуля stdlib в каталоге скрипта (random.py, json.py) затеняет настоящий модуль: каталог скрипта стоит в sys.path первым.

Примеры

import os, sys
sys.path.insert(0, '.')
os.makedirs('shop', exist_ok=True)
with open('shop/__init__.py', 'w', encoding='utf-8') as f:
    f.write("print('выполняется shop/__init__.py')\nfrom .prices import total\n")
with open('shop/prices.py', 'w', encoding='utf-8') as f:
    f.write('def total(xs): return sum(xs)\n')
import shop  # → выполняется shop/__init__.py
import shop.prices  # пакет уже загружен: __init__.py второй раз не выполняется
print(shop.total([1, 2, 3]))  # → 6
import os, sys
sys.path.insert(0, '.')
os.makedirs('notes', exist_ok=True)  # каталог без __init__.py
import notes
print(notes.__file__)  # → None — пакет пространства имён
import sys
sys.path.insert(0, '.')  # так стоит каталог запущенного скрипта
with open('random.py', 'w', encoding='utf-8') as f:
    f.write("print('это мой random.py')\n")
import random  # → это мой random.py
print(hasattr(random, 'randint'))  # → False — настоящий random затенён

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности