Modülün içindeki bir modüle nasıl başvurulur?


159

Bu modülün içinden bir modüle nasıl referans alabilirim? Ayrıca, bu modülü içeren pakete nasıl referans alabilirim?


7
Modül kapsamında bir değişken (örneğin, bir işlev veya sınıf dışında BLAH = 10), sonra BLAH adlı bir sınıf / işlev değişkeni olduğundan ve farklılaştırmak istediğiniz için bu soruyu soruyor olabilirsiniz . Burada geçerli bir soru: Bu gerekli mi? Kapsam kuralları, özellikle sizden sonra kodunuzu alan (yani, siz, 6 ay sonra) 'aptal' tarafından, herkesin bildiği gibi hataya açıktır. Bunun gibi püf noktaları nadiren gereklidir; Onlardan tamamen kaçınmaya çalışıyorum çünkü daha sonra kafa karıştırıcı ve yanlış değiştirilmişler.
Kevin J. Rice

2
@ KevinJ.Rice "sen, sonra (yani, 6 ay sonra) kodunu alır 'aptal'" günümü yaptı!
arctelix

8
Soruyu neden sorduğu kimin umurunda? Bunu yapmak için geçerli birçok neden vardır.
Christopher Barber

Kapatılması gerekiyor. Çok faydalı.
mlvljr

Yanıtlar:


212
import sys
current_module = sys.modules[__name__]

3
bunun dışında modül yeniden yüklendiğinde oldukça doğru olmayacaktır; Bir referansın tutulacağı garanti edilen bir yer olduğunu düşünmüyorum, eğer olsaydı, yeniden yükleme gerçekten işe yaramazdı, değil mi?
Dima Tisnek

14
Yeniden yükleme aynı modül nesnesini yeniden kullanır; yeni bir modül nesnesi oluşturulmadığından, yeniden yükleme karşısında hala doğrudur.
bukzor

18

Sys modülünü içe aktarmayan ve tartışmasız - zevkinize bağlı olan bir daha teknik - daha basit:

current_module = __import__(__name__)

İthalat olmadığını unutmayın. Python her modülü sadece bir kez alır.


Bu sys ithal önlemek için gerçekten güzel bir yol gibi görünüyor. Okumak için biraz sezgisel olmak dışında, bu yaklaşımın herhangi bir olumsuz yanı var mı?
JeremyDouglass

@JeremyDouglass. Farkında olduğumdan değil. import , yasal, belgelenmiş, yerleşik bir işlevdir (tek xx işlevi). Bunu 'importlib' paketiyle değiştirebilirsiniz (içe aktarmanız gerekir). Belki - bana hiç gelmedi - göreceli / mutlak içe aktarma ile ilgili bir sorun olabilir, eğer sys.path'de aynı ada sahip bir modül varsa, bu durumda onu fonksiyonun 'level' argümanı ile çözebilirsiniz.
Uri

16

Bu modülde bir sınıfınız varsa, sınıfın __module__özelliği sınıfın modül adıdır. Böylece modüle üzerinden erişebilirsiniz sys.modules[klass.__module__]. Bu aynı zamanda fonksiyonlar için de geçerlidir.


4
Aslında, (en azından) bir işlev için, __module__özellik bir modül değil, bir dize gibi görünüyor; bu nedenle inspect.getabsfile(func.__module__)" TypeError: 'os' bir modül, sınıf, yöntem, işlev, geri izleme, çerçeve veya kod nesnesi değildir ; süre inspect.getabsfile(sys.modules[o.__module__])geçmesine görünüyor.
sdaau

12

Mevcut modülün adını kullanarak __name__

Modül referansı sys.modulessözlükte bulunabilir.

Python belgelerine bakın


1

Dışarıdan aktarabilirsiniz:

mymod.init(mymod)

İdeal değil ama şu anki kullanım durumum için çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.