Względny import ma miejsce za każdym razem, gdy importujesz pakiet względem bieżącego skryptu / pakietu.
Rozważmy na przykład następujące drzewo:
mypkg
├── base.py
└── derived.py
Teraz derived.pypotrzebujesz czegoś od base.py. W Pythonie 2 można to zrobić w następujący sposób (w derived.py):
from base import BaseThing
Python 3 już tego nie obsługuje, ponieważ nie jest jasne, czy chcesz mieć wartość „względną” czy „absolutną” base. Innymi słowy, jeśli basew systemie był zainstalowany pakiet Pythona o nazwie , otrzymasz niewłaściwy.
Zamiast tego wymaga użycia jawnych importów, które jawnie określają lokalizację modułu na podstawie podobnych ścieżek. Twój derived.pywyglądałby tak:
from .base import BaseThing
Wiodący .mówi „import basez katalogu modułów”; innymi słowy, .basemapuje do ./base.py.
Podobnie, istnieje ..prefiks, który przechodzi w górę w hierarchii katalogów, jak ../(z ..modmapowaniem do ../mod.py), a następnie ...przechodzi o dwa poziomy w górę ( ../../mod.py) i tak dalej.
Należy jednak pamiętać, że ścieżki względne wymienione powyżej odnosiły się do katalogu, w którym znajduje się bieżący moduł ( derived.py), a nie do bieżącego katalogu roboczego.
@BrenBarn wyjaśnił już przypadek importu gwiazdy. Dla kompletności powiem to samo;).
Na przykład musisz użyć kilku mathfunkcji, ale używasz ich tylko w jednej funkcji. W Pythonie 2 pozwolono ci być częściowo leniwym:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Zauważ, że już wyzwala ostrzeżenie w Pythonie 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
We współczesnym kodzie Python 2 powinieneś, aw Pythonie 3 musisz zrobić albo:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
lub:
from math import *
def sin_degrees(x):
return sin(degrees(x))