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?
cevap
import sys
current_module = sys.modules[__name__]
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? –
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
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.
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
Teşekkürler, düzeltildi. – Michael
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 documentationDoküman bağlantısını takdir ediyorum. –
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:
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
@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
Sen ondan dışında geçirebilirsiniz.
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. –
@ KevinJ.Rice "Kodunuzu sizden sonra alan 'salak' (yani, 6 ay sonra)" günümü kutladı! – arctelix
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 –