Impor relatif terjadi setiap kali Anda mengimpor paket relatif terhadap skrip / paket saat ini.
Pertimbangkan contoh pohon berikut:
mypkg
├── base.py
└── derived.py
Sekarang, Anda derived.py
membutuhkan sesuatu dari base.py
. Dengan Python 2, Anda bisa melakukannya seperti ini derived.py
:
from base import BaseThing
Python 3 tidak lagi mendukung itu karena tidak eksplisit apakah Anda menginginkan 'relatif' atau 'absolut' base
. Dengan kata lain, jika ada paket Python yang base
terinstal di sistem, Anda akan salah.
Alih-alih itu mengharuskan Anda untuk menggunakan impor eksplisit yang secara eksplisit menentukan lokasi modul berdasarkan path-sama. Anda derived.py
akan terlihat seperti:
from .base import BaseThing
Yang terkemuka .
mengatakan 'impor base
dari direktori modul'; dengan kata lain, .base
peta ke ./base.py
.
Demikian pula, ada ..
awalan yang naik hirarki direktori seperti ../
(dengan ..mod
pemetaan ke ../mod.py
), dan ...
yang naik dua tingkat (../../mod.py
) dan seterusnya.
Namun harap dicatat bahwa jalur relatif yang tercantum di atas relatif terhadap direktori tempat modul saat ini ( derived.py
) berada, bukan direktori kerja saat ini.
@BrenBarn telah menjelaskan impor bintang. Untuk kelengkapan, saya harus mengatakan hal yang sama;).
Misalnya, Anda perlu menggunakan beberapa math
fungsi tetapi Anda menggunakannya hanya dalam satu fungsi. Dalam Python 2 Anda diizinkan menjadi semi-malas:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Perhatikan bahwa itu sudah memicu peringatan dengan Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
Dalam kode Python 2 modern Anda harus dan dalam Python 3 Anda harus melakukan salah satu:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
atau:
from math import *
def sin_degrees(x):
return sin(degrees(x))
Untuk mendukung Python 2 dan Python 3, gunakan impor relatif eksplisit seperti di bawah ini. Mereka relatif terhadap modul saat ini. Mereka telah didukung mulai dari 2,5 .
sumber
import .brother
sintaks tidak valid untuk kedua python 2 dan 3import ..uncle
. Tetap. Oh, apa yang telah kupikirkan ... mungkin terganggu oleh para ksatria yang mengatakan Ni!Menambahkan kasus lain pada jawaban Michał Górny:
Perhatikan bahwa impor relatif didasarkan pada nama modul saat ini. Karena nama modul utama selalu "
__main__
", modul yang dimaksudkan untuk digunakan sebagai modul utama aplikasi Python harus selalu menggunakan impor absolut.sumber