Python göreli içe aktarmalar artık kesinlikle tavsiye edilmemektedir, ancak bu durumda mutlak_import'un kullanılması şiddetle önerilir.
Lütfen Guido'nun kendisinden alıntı yapan bu tartışmaya bakın :
"Bu çoğunlukla tarihsel değil mi? Yeni göreli ithalat sözdizimi uygulanana kadar göreli ithalata ilişkin çeşitli sorunlar vardı. Kısa vadeli çözüm, bunları kullanmamayı önermekti. Uzun vadeli çözüm, kesin bir sözdizimi uygulamaktı. Şimdi anti-tavsiyeyi geri çekmenin zamanı geldi. Tabii ki, denize düşmeden - hala onlara kazanılmış bir zevk buluyorum; ama onların yeri var. "
OP , şunu söyleyen PEP 328'i doğru şekilde bağlar :
En önemlisi, alt paketleri düzenlemek zorunda kalmadan büyük paketlerin yapısını yeniden düzenleyebilmek olan birkaç kullanım durumu sunuldu. Ek olarak, bir paketin içindeki bir modül, göreli içe aktarmalar olmadan kendisini kolayca içe aktaramaz.
Ayrıca neredeyse yinelenen soruya bakın neden Python göreli ithalat kullanmak veya
Elbette hala bir zevk meselesi olarak duruyor. Göreceli içe aktarmalarla kodu taşımak daha kolay olsa da, bu beklenmedik bir şekilde işleri bozabilir; ve ithalatı yeniden adlandırmak o kadar da zor değil.
PEP 328'den yeni davranışı zorlamak için şunu kullanın:
from __future__ import absolute_import
Bu durumda, örtük göreceli içe aktarma artık mümkün import localfile
olmayacaktır (örn. Artık çalışmayacaktır, yalnızca from . import localfile
). Temiz ve ileride kanıtlanmış davranış için, absolute_import kullanılması tavsiye edilir.
Önemli bir uyarı, PEP 338 ve PEP 366 nedeniyle , göreceli içe aktarımların python dosyasının bir modül olarak içe aktarılmasını gerektirmesidir - göreceli içe aktarımı olan bir file.py'yi yürütemezsiniz veya bir ValueError: Attempted relative import in non-package
.
En iyi yaklaşım değerlendirilirken bu sınırlama dikkate alınmalıdır. Guido, her durumda bir modülden komut dosyası çalıştırmaya karşıdır:
Bu konuda ve __main__ makinenin diğer önerilen oynamalarında -1'im. Tek kullanım durumu, her zaman bir anti-model olarak gördüğüm bir modülün dizininde yaşayan betikleri çalıştırmak gibi görünüyor. Fikrimi değiştirmemi sağlamak için, beni öyle olmadığına ikna etmelisin.
Konuyla ilgili kapsamlı tartışmalar SO'da bulunabilir; yeniden. Python 3 bu oldukça kapsamlıdır:
from _ import ...
, bu nedenle örnekler olacaktırfrom .. import A
vefrom . import B