ProgramlamaPython Geliştirici

Python'daki ad alanı (namespaces) ve modüllerin düzenlenmesi özelliklerini anlatın. İthalatlar nasıl çalışır ve büyük bir projede isim çakışmalarını nasıl önleyebiliriz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Python'da ad alanı (namespace), isimlerin ve nesnelerin eşleştirildiği bir sözlüktür. Ad alanlarının seviyeleri: yerel, global, yerleşik. Modüller, kodun düzenlenmesi için ayrı alanlardır. İthalat sırasında Python, her modül için yeni bir ad alanı oluşturur.

İthalatın Çalışması

  • import module — modülü ithal eder ve nesnelere module.name aracılığıyla erişim sağlar.
  • from module import name — nesneyi doğrudan mevcut ad alanına ithal eder (isim çakışması riski).
  • as — bir takma ad belirlemeye izin verir.

İsim çakışmalarını önlemek için:

  • Modülleri açıkça ithal edin (import mymodule), yıldız (from... import *) kullanmayın.
  • Projeyi paketler aracılığıyla organize edin (içinde __init__.py bulunan dizinler).
  • Benzersiz, açıklayıcı isimler kullanın;
  • Takma adlar kullanın (import module as m).

Örnek Yapı

project/
  package/
    __init__.py
    module1.py
    module2.py
import package.module1 from package.module2 import function as fn

Kandırıcı Soru.

Soru: Bir modül iki kez ithal etmenin farkı nedir? Modülün tüm kodu tekrar mı çalışacak?

Cevap: Hayır. İlk ithalat sırasında modül çalıştırılır ve sonucu sys.modules içinde önbelleğe alınır. Tekrar ithal etmek, zaten yüklenmiş modül nesnesini geri döndürür, kodu tekrar çalıştırılmaz.

# module.py print('Merhaba!') # main.py import module # Merhaba! yazdırır import module # hiçbir şey yazdırmaz

Konunun inceliklerini bilmediği için gerçek hata örnekleri.


Hikaye

Geliştiriciler, birkaç modülde from settings import * kullanarak, ayarları değiştirdiklerinde beklenmedik "yerel değişkenlerin" "üzerine yazılmasına" neden oldular, bu da zor tespit edilebilen hatalara yol açtı.

Hikaye

Büyük bir projede farklı takımlar aynı isimleri taşıyan modüller (örneğin, utils.py) oluşturdu. Entegrasyon aşamasında, "aynı" isimli modüller birbirinin "yerine geçti" ve beklenmedik davranışlar ve karmaşık hatalara yol açtı.

Hikaye

Bir kütüphanede, importlib.reload aracılığıyla yeni ayarlarla bir modülün "sıcak yeniden ithal edilmesi" denendi. Diğer daha önce ithal edilen modüllerin, nesnelerin eski referanslarını sakladığı dikkate alınmadı ve bu nedenle değişiklikler uygulamanın tüm bölümlerinde uygulanmadı.