Відносний імпорт відбувається кожного разу, коли ви імпортуєте пакет відносно поточного сценарію / пакету.
Розглянемо для прикладу таке дерево:
mypkg
├── base.py
└── derived.py
Тепер ваше derived.pyщось вимагає base.py. У Python 2 ви можете це зробити так (в derived.py):
from base import BaseThing
Python 3 більше не підтримує це, оскільки не є явним, чи хочете ви "відносного" чи "абсолютного" base. Іншими словами, якби baseв системі встановлений пакунок Python , ви отримаєте неправильний.
Натомість він вимагає використання явного імпорту, який чітко визначає розташування модуля на основі шляху. Ви derived.pyб виглядали так:
from .base import BaseThing
Ведучий .говорить "імпорт baseз каталогу модулів"; Іншими словами, .baseкарти на ./base.py.
Аналогічно, є ..префікс, який піднімається вгору за ієрархією каталогів, як ../(з ..modвідображенням до ../mod.py), а потім, ...який переходить на два рівні вгору ( ../../mod.py) і так далі.
Однак зауважте, що зазначені вище відносні шляхи були відносно до каталогу, де знаходиться поточний модуль ( derived.py), а не поточного робочого каталогу.
@BrenBarn вже пояснив випадок імпорту зірки. Для повноти доведеться сказати те саме;).
Наприклад, вам потрібно використовувати кілька mathфункцій, але ви використовуєте їх лише в одній функції. У Python 2 вам дозволили бути напівлінивим:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Зауважте, що це вже запускає попередження в Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
У сучасному коді Python 2 ви повинні, а в Python 3 ви повинні:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
або:
from math import *
def sin_degrees(x):
return sin(degrees(x))