Python'un runpy modülünün sahibiyim ve mevcut ithalat sisteminin bakımcılarından biriyim. İthalat sistemimiz etkileyici bir şekilde esnek olmasına rağmen, birkaç değişiklik yapmadan toptan satışa geçmesini tavsiye ediyorum - geriye dönük uyumluluk endişeleri nedeniyle, olması gerekenden daha garip olan birçok şey var.
Python'da PEP 302 ile acı veren şeylerden biri, çekirdek ithalat sistemini kullanmaya dönüştürmemizin ne kadar sürdüğü. On yılın daha iyi bir kısmı için, ithal kancalarla karmaşık bir şey yapan herkes iki parçaya takılıp kaldı: bir tanesi PEP 302 uyumlu yükleyicileri kullanıyor (zip ithalatı gibi) ve ikincisi standart dosya sistemi tabanlı ithalat mekanizmasını kullanıyor. Önümüzdeki 3.3'te, PEP 302 yükleyicilerin taşınması, standart dosya sistemi içe aktarma mekanizmasından içe aktarılan modüllerle de ilgilenecektir. Eğer kaçınabiliyorsanız, bu hatayı tekrar etmemeye çalışın.
PEP 420 (Python 3.3 için uygulanmıştır), ithalatçıların isim alanı paketlerine bölümlerini katkıda bulunmalarını sağlamak için protokole bazı eklemeler yapar. Ayrıca, Finder API tanımındaki bir adlandırma sorununu da düzeltir (yanlış kullanılan "find_module" ifadesini daha doğru "find_loader" ile değiştirerek). Bunun umarım hepsi, 3.3rc1 birkaç hafta içinde yuvarlanıncaya kadar dilin belirttiği şekilde daha net belgelenmelidir.
Dikkat çeken bir diğer sorun, özellikle PEP 302'de belgelenen yaklaşımın çok fazla küresel süreç süreci olmasıdır. Bizi bu yoldan takip etmeyin - durumu daha tutarlı bir nesne modelinde kapsüllemeye çalışın, böylece diğer modülleri seçmeli olarak içe aktarmak biraz daha kolaydır (C uzatma modülleri, bu tür bir kapsüllemeyi tamamen etkili kılma, hatta bir miktar kapsülleme seviyesine sahiptir. yardımcı olabilir).
PEP 406 (http://www.python.org/dev/peps/pep-0406/) Python'un gelişmiş durum kapsülleme yaklaşımının geriye dönük uyumlu bir evrimini tartışıyor. En başından kapsüllenmiş bir durum modeliniz varsa, API'lerinizi buna göre tanımlayabilir ve ithalatçıların ve yükleyicilerin genel duruma erişmelerini önleyebilirsiniz (bunun yerine aktif motora bir referanstan geçmek).
PEP 302'deki bir başka eksik parça, ithalatçı tarafından sağlanan modüller üzerinden bir yineleyici için ithalatçı talep etme kabiliyetidir (donma programları ve dokümanlar çıkaran otomatik dokümantasyon araçları gibi şeyler için gereklidir). : İnanılmaz derecede kullanışlı olduğu için, muhtemelen olsun halindeyken onu standartlaştırılması daha iyi olurdu http://docs.python.org/dev/library/pkgutil#pkgutil.iter_modules muhtemelen nihayet resmen belirtilen bu yükseltmek edeceğiz ( Python'daki API 3.4)
Ve son yorumum, ithalat sistemi ile yükleyici nesneleri arasındaki sorumluluk dağılımına yakından bakmanız gerektiğidir. Özellikle, "load_module" API'sini "init_module" ve "exec_module" adımlarına ayırmayı düşünün. Bu, yükleyicilerin doğrudan ithalat durumu ile etkileşime girmesi gereken dereceyi en aza indirmenizi sağlar.
PEP 302 ve importlib daha esnek bir ithalat sistemi için harika bir başlangıç noktasıdır, ancak kesinlikle kaçınılması gereken hatalar var.