2009-11-04 19 views
111

Bu modülün içinden bir modüle nasıl başvuru yapabilirim? Ayrıca, bu modülü içeren pakete nasıl başvuru yapabilirim? O modülünde bir sınıf varsaPython: Modülün içindeki bir modüle nasıl başvuru yapabilirim?

+5

Bu soruyu soruyor olabileceğinizden şüpheleniyorum çünkü ** modül kapsamında bir değişkeniniz var ** (örneğin, BLAH = bir işlev veya sınıf dışında 10), sonra bir ** sınıf/fonksiyon değişkeni ** BLAH olarak adlandırılır ve ayırt etmek istiyorsun. Burada geçerli bir soru şudur: ** Bu gerekli midir? ** Kapsam kuralları, özellikle de sizin kodunuzu alan (örneğin 6 ay sonra) 'aptal' tarafından yanlışlıkla hataya eğilimlidir. Bunun gibi hileler nadiren gereklidir; Onlardan tamamen uzak durmaya çalışırım çünkü daha sonra kafa karıştırıcı ve yanlış bir şekilde modifiye edilirler. –

+1

@ KevinJ.Rice "Kodunuzu sizden sonra alan 'salak' (yani, 6 ay sonra)" günümü kutladı! – arctelix

+4

Soruyu neden sorduğuna kim bakıyor? Bunu yapmak için birçok geçerli sebep vardır. Modül yeniden yüklenirse, bunun haricinde –

cevap

165
import sys 
current_module = sys.modules[__name__] 
+3

oldukça doğru olmaz; Bir referansın muhafaza edilmesinin garanti edildiği herhangi bir yer olduğunu sanmıyorum, eğer varsa, yeniden yükleme gerçekten işe yaramazdı, değil mi? –

+10

Yeniden yükleme aynı modül nesnesini yeniden kullanır; yeni modül nesnesi oluşturulmaz, bu yüzden yeniden yükleme sırasında doğrudur. – bukzor

14

ardından sınıfın __module__ mülkiyet sınıfının modül adıdır. Böylece modüle sys.modules[klass.__module__] üzerinden erişebilirsiniz. Bu ayrıca işlevler için de çalışır.

+4

Aslında, bir işlev için (en azından), '__module__' özelliği bir modül değil, bir dize; bu nedenle bir "inspect.getabsfile (func .__ modül __)", "_TypeError: 'os' bir modül, sınıf, yöntem, işlev, geri izleme, çerçeve veya kod nesnesi değil" ile başarısız olur "; inspect.getabsfile (sys.modules [o .__ module __]) ise gözüküyor. – sdaau

+0

Teşekkürler, düzeltildi. – Michael

8

Sen sys.modules sözlükte bulunabilir __name__

modül referansını kullanarak mevcut modülün ismini alabilirsiniz.

current_module = __import__(__name__) 

hiçbir alma yoktur unutmayın: - zevkinize bağlıdır - basit

Python tartışmasız sys modülü almak ve yok documentation

+3

Doküman bağlantısını takdir ediyorum. –

3

Bir daha teknik, bakın. Python her modülü yalnızca bir kez içe aktarır.

mymod.init(mymod) 

İdeal değil ama benim şimdiki kullanım örneği için çalışır:

+0

Bu, sys'i almayı önlemenin gerçekten güzel bir yolu gibi görünüyor. Okuması biraz karşı sezgisel olmaktan başka, bu yaklaşımın herhangi bir potansiyel downsides var mı? – JeremyDouglass

+0

@JeremyDouglass. Bildiğim kadarıyla değil. __import__, yasal, belgelenmiş, yerleşik bir işlevdir (yalnızca __xx__ işlevi). Bunu 'importlib' paketi ile değiştirebilirsiniz (içe aktarmanız gerekir). Belki - bana hiç olmadı - göreceli/mutlak içe aktarma ile ilgili bir sorun olabilir, eğer sys.path içinde aynı isme sahip bir modül varsa, bu durumda fonksiyonu 'seviye' argümanıyla çözebilirsiniz. – Uri

1

Sen ondan dışında geçirebilirsiniz.

İlgili konular