Baru-baru ini saya meningkatkan versi pylint , pemeriksa gaya Python yang populer.
Itu sudah balistik di seluruh kode saya, menunjukkan tempat di mana saya mengimpor modul dalam paket yang sama, tanpa menentukan jalur paket lengkap.
Pesan kesalahan baru adalah W0403.
W0403: Impor relatif% r, harus% r
Digunakan ketika impor relatif ke direktori paket terdeteksi.
Contoh
Misalnya, jika paket saya disusun seperti ini:
/cake
/__init__.py
/icing.py
/sponge.py
/drink
dan dalam paket spons saya tulis:
import icing
dari pada
import cake.icing
Saya akan mendapatkan kesalahan ini.
Meskipun saya mengerti bahwa tidak semua pesan Pylint memiliki kepentingan yang sama, dan saya tidak takut untuk mengabaikannya, saya tidak mengerti mengapa praktik semacam itu dianggap sebagai ide yang buruk.
Saya berharap seseorang bisa menjelaskan perangkap, jadi saya bisa meningkatkan gaya pengkodean saya daripada (seperti yang saya rencanakan saat ini) mematikan peringatan yang tampaknya palsu ini.
sumber
import .icing
daripadafrom . import icing
from <> import
;import <>
selalu absolut. Tentu saja, impor absolut dapat digunakanfrom <> import
dengan menghilangkan titik-titik terkemuka. Alasannyaimport .foo
dilarang adalah karena setelahimport XXX.YYY.ZZZ
ituXXX.YYY.ZZZ
dapat digunakan dalam ekspresi. Tetapi.moduleY
tidak bisa digunakan dalam ekspresi.Ada beberapa alasan bagus:
Impor relatif mudah rusak, saat Anda memindahkan modul.
Bayangkan Anda memiliki modul
foo.bar
, a ,foo.baz
danbaz
modul dalam paket Anda.foo.bar
imporfoo.baz
, tetapi menggunakan impor relatif.Sekarang, jika Anda pindah
foo.bar
kebar
, modul Anda tiba-tiba mengimpor yang berbedabaz
!Impor relatif bersifat ambigu. Bahkan tanpa berpindah-pindah
bar
modul pada contoh di atas, pengembang baru yang datang ke proyek Anda dapat dimaafkan karena tidak menyadari bahwabaz
itu sebenarnyafoo.baz
bukanbaz
paket tingkat root .Impor absolut menjelaskan modul apa yang sedang digunakan. Dan sebagai
import this
khotbah, eksplisit lebih baik daripada implisit.Python 3 telah menonaktifkan impor relatif implisit sama sekali; impor sekarang selalu diartikan sebagai absolut, artinya dalam contoh di atas
import baz
akan selalu mengimpor modul tingkat atas. Anda harus menggunakan sintaks impor eksplisit sebagai gantinya (from . import baz
).Porting contoh dari Python 2 ke 3 akan menyebabkan masalah yang tidak terduga, menggunakan impor absolut sekarang akan membuat kode Anda menjadi bukti masa depan.
sumber