Sorunun tarihi: Paketler, Python'da büyük kod tabanlarını yapılandırmak ve kodu yeniden kullanmak için ortaya çıkmıştır. Projeyi mantıksal modüllere ayırarak gerekli fonksiyonelliği desteklemeyi ve içe aktarmayı kolaylaştırırlar.
Sorun: Paketlerin yapısını yanlış anlamak, içe aktarmada hatalara, isim çakışmalarına ve betiklerin çalıştırılmasında hatalara yol açar. Paketler ile modüller arasındaki farkı ve göreli ve mutlak içe aktarma ile ilgili kuralları bilmek önemlidir.
Çözüm:
Paket, __init__.py dosyası (boş veya başlatma kodu ile) bulunan herhangi bir dizindir. Paketler başka paketler ve modüller içerebilir. Örnek yapı:
project/
├── mypackage/
│ ├── __init__.py
│ ├── mod1.py
│ └── subpackage/
│ ├── __init__.py
│ └── mod2.py
└── script.py
İçe aktarma için göreli (from .subpackage import mod2) veya mutlak yolları (from mypackage.subpackage import mod2) kullanırız. Mutlak olanlar büyük projeler için daha tercih edilir.
Önemli Özellikler:
__init__.py dosyasının varlığı ile tanımlanırHer paket yapmak istediğimiz klasörde init.py dosyası mutlaka var mı olmalıdır?
Evet, Python 3.3’ten önce; modern Python sürümlerinde (3.3+) "örtük" isim alanı paketleri vardır, ancak tam uyumluluk için dosyanın yine de bulunması önerilir.
Paket yerine modülü içe aktarılırsa ne olur?
Sadece bu paketin __init__.py dosyasındaki kod çalıştırılır.
“from . import mod1” ile “import mod1” arasındaki fark nedir?
from . import mod1 (göreli içe aktarma) yalnızca paket içinde çalışır, mutlak içe aktarma sys.path üzerinde modülü arar, bu da isim çakışmalarına yol açabilir.
__init__.py dosyalarının bulunmaması veya kopyalanmasıOlumsuz durum: Farklı alt klasörlerde aynı isimli modüller, mutlak içe aktarmalar kullanılmadan. Bir modüle istenildiği gibi erişilemiyor. Artılar:
Olumlu durum:
Belirgin mutlak içe aktarmalar, doğru klasör yapısı ve __init__.py varlığı.
Artılar: