Konu Tarihçesi
Namespaces (isim alanları) Python'un en temel kavramlarından biridir ve dilin ilk sürümlerinden beri mevcuttur. Farklı program parçaları arasında değişkenler, fonksiyonlar ve sınıflar arasındaki çakışmaları önlemek için isimlerin sistematikleştirilmesini amaçlar.
Sorun
Büyük projelerde çok sayıda fonksiyon, sınıf, değişken ve modül ortaya çıkar. Namespace'lerin doğru kullanılmaması durumunda önemli isimler kaybolabilir, beklenmedik değişken gölgeleri oluşabilir ve test etme ve genişletme süreçlerinde zorluklar yaşanabilir.
Çözüm
Python'da namespace, isimleri nesnelerle ilişkilendiren bir eşleme (mapping)'dir. Farklı isim alanı düzeyleri vardır: yerel, global, modül alanları ve sınıf alanları. Bu tür bir ayrımın anlaşılması, gerekli nesnelere doğru erişimi garanti eder ve çakışmaların en aza indirilmesini sağlar.
Kod örneği:
def foo(): x = 10 # x, fonksiyonun yerel isim alanında print(x) y = 20 # y, modülün global isim alanında foo() print(y)
Anahtar özellikler:
Aynı fonksiyonda global bir isimle aynı isme sahip bir yerel değişken tanımlanırsa ne olur?
Yerel değişken, fonksiyon yürütülürken global olanı “gölgeleyecektir”; fonksiyon dışında global olan değişmeyecek.
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
Mevcut isim alanındaki tüm isimlerin listesini nasıl alırsınız?
locals(), globals(), dir() fonksiyonları, mevcut kapsamda/namespace'deki isimlerin karşılık gelen eşlemelerini veya listelerini döndürür.
Sınıf isim alanları ve örnek isim alanları arasındaki fark nedir?
Sınıf isim alanı, sınıfın tüm örnekleri için ortak olan özellikleri tanımlar. Örnek isim alanı ise belirli bir nesnenin özellikleridir. Örnek üzerindeki değişiklikler sınıfa etki etmez ve tersine.
Büyük projenin her bölümünde from mymodule import * kullandık. Sonuç olarak, fonksiyon isimleri kayboldu ve paketler arasındaki isim çakışmaları nedeniyle zor tespit edilebilen hatalar oluştu.
Artılar:
Eksiler:
İthalatlarda takma adlara (import mymodule as mm) geçiş yapıldı, modüllerin net yapılandırılması sağlandı.
Artılar:
Eksiler: