2015-01-30 25 views
20

Ben Şişesi __import__ için bir modül Werkzeug kullanıyordum fark ettim ve biraz karışıktı. Dokümanın üzerine gittim ve kontrol ettim ve modülün nerede göründüğü konusunda size daha fazla kontrol sağladığını gördüm, ama ben tam olarak nasıl emin değilim ve nasıl sıfır fikri var importlib.import_module farklı .ithalat()?

Werkzeug örnekte Garip olan şey ise sadece __import__(import_name) diyor, bu yüzden opsiyonel parametreleri görmezden geliyor çünkü, bu sadece import ifadesini kullanarak herhangi ne gibi farklar olduğunu görmüyorum.

Herkes açıklayabilir mi? Daha önce SO ile ilgili benzer soruları sormuş olan diğer kişilere baktım ama çok net bir şekilde ifade edilmiş sorular değildi ve cevaplar buna değinmedi.

+1

Kullanım '__import__' kimin adı yalnızca runtime' bilinen bir modülü almak istediğiniz'. Bundan başka...Bu size daha fazla güç verir –

+0

ithalat için daha fazla güç sağlar Eğer bellek doğru bir şekilde hizmet verirse, bir videoda WerkZeug'un bir nedenle aşırı yüklenme içerdiğinden bahsetmişken, bir videoda içe aktarma konusunda bir David Beasely videosu vardır. – Carel

cevap

34

__import__, modülleri içe aktarmak için kullanılan düşük düzey bir kanca işlevidir; modülünü dinamik olarak modülünün bir değişken olarak içe aktarılacak modül adını vererek, import ifadesinin yapmanıza izin vermeyeceği şekilde kullanılabilir.

importlib.import_module()

* işlevsellik için güzel bir API üretmek için bu kanca etrafında sarıcı; Python 2'ye çok yeni bir eklenmiştir ve Python 3'te daha fazla etkiye sahiptir. __import__'u kullanan kod tabanları genellikle bunu yaparlar, çünkü eski Python 2 sürümleri ile uyumlu kalmak isterler, ör. Python 2.7'den önceki her şey.

__import__ kullanmanın bir yan etkisi, içe aktarılan modülü döndürmesi ve ad alanına hiçbir şey eklememesi olabilir; Bu yeni adı istemediyseniz, yeni adı silmek zorunda kalmadan onunla içe aktarabilirsiniz; import somename kullanarak, ad alanınıza somename eklenir, ancak __import__('somename') bunun yerine yok sayılacak olan içe aktarılan modülü döndürür. Werkzeug, bu sebepten dolayı kancayı tek bir yerde kullanır.

Diğer tüm kullanımlar dinamik içe aktarmalarla ilgilidir. Werkzeug, Python 2.6'yı destekliyor, dolayısıyla importlib'u kullanamaz.


*importlib bir Saf-Python uygulamasıdır ve __import__ bir C-optimize edilmiş sürümünü kullanacaktır sus import_module(), o uygulamayı kullanır. Her iki sürüm de importlib._bootstrap._find_and_load()'a geri dönüyor, bu yüzden fark çoğunlukla akademik.

+0

"Bu yeni ismi istemediyseniz yeni adı silmek zorunda kalmadan onunla birlikte içe aktarabilirsiniz" ifadesini tam olarak anlamadım. Bir dakikanız varsa, belki de bir bebekle konuşuyormuşsunuz gibi düşünebilir miydiniz? – Aerovistae

+0

@Aerovistae: bunu biraz güncelledi; 'import sys', sys' adını ad alanınıza ekler (modüle bağlı), __import __ ('sys')' 'sys' modül nesnesini arayan kişiye döndürür, daha sonra bu nesneyi yoksaymak ücretsizdir. –

+0

@MartijnPieters namespace tarafından sys.modules' demek istediniz? – NeoWang

3

__import__(import_name), bu yüzden bu sadece

Hem __import__() ve importlib.import_module() Modülü olduğunda bir modülü almak için izin alma ifadesini kullanarak herhangi ne gibi farklar olduğunu görmüyorum dize olarak adlandır.

x = 're' 
import x 

veya elde edersiniz: Sen yazamazsınız

File "1.py", line 3, in <module> 
import x ImportError: No module named x