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.py
potrzebujesz 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 base
w 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.py
wyglądałby tak:
from .base import BaseThing
Wiodący .
mówi „import base
z katalogu modułów”; innymi słowy, .base
mapuje do ./base.py
.
Podobnie, istnieje ..
prefiks, który przechodzi w górę w hierarchii katalogów, jak ../
(z ..mod
mapowaniem 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 math
funkcji, 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))
Aby obsługiwać zarówno Python 2, jak i Python 3, użyj jawnych importów względnych, jak poniżej. Odnoszą się do bieżącego modułu. Są obsługiwane począwszy od 2.5 .
źródło
import .brother
ma niepoprawną składnię zarówno dla Pythona 2, jak i 3import ..uncle
. Naprawiony. Och, co ja sobie myślałem ... prawdopodobnie rozproszyli mnie rycerze, którzy mówią Ni!Do odpowiedzi Michała Górnego dodano kolejny przypadek:
Zwróć uwagę, że import względny jest oparty na nazwie bieżącego modułu. Ponieważ nazwa modułu głównego to zawsze "
__main__
", moduły przeznaczone do użycia jako moduł główny aplikacji Python muszą zawsze używać importu bezwzględnego.źródło