2016-04-07 20 views
9

Python internals hakkında soru. import abc'u çalıştırırsam, Python modülü yeni bir ad boşluğuna okur ve yeni ad boşluğuna işaret etmek için global ad alanındaki abc değişkenini bağlar."Abc import xyz" kaynağından yürütmek, modül abc nereye gider?

Ben from abc import xyz o zaman bazı yeni isim alanına tüm modülü abc okur ve daha sonra modül içine okundu bu yeni oluşturulan ad alanında xyz bağlıdır aynı nesneye genel ad değişken xyz bağlar yürütmek durumunda. En azından benim anlayışım bu.

abc'un daha sonra okuduğu ad alanına ne olur? Bir yerde yaşadığını varsayalım, çünkü xyz bu ad alanındaki diğer nesnelere erişebilir. Bu "hayalet" abc ad alanına bir şekilde erişilebilir mi?

Ayrıca ben

from abc import xyz 
from abc import fgh 

yaparsanız xyz ve fghabc aynı küresel değişkeni değiştirirseniz o, sadece orada olacak öyleyse, yalnızca bir "hayalet" abc alan bulunduğundan varsayarak yaşıyorum bir kopyası. Bu doğru mu?

+1

Bu sadece meraktan muaftır mı? Modüle "gizlice" bu şekilde erişmeye çalışmak için gerçek bir sebep yok; Modül nesnesine erişmek istiyorsanız, normal olarak içe aktarın. – BrenBarn

+0

Sadece meraktan, işlerin başlığın altında nasıl çalıştığını anlamaya çalışıyor. Çok fazla veri çalışması yapıyorum, bu çalışmanın bir kısmını R'den Python'a taşımayı düşünüyorum, bu yüzden sadece bir anlayış oluşturmak. – mrip

cevap

6

Modül nesnesi sys.modules'da depolanır. Yani from abc import xyz yaparsanız, sys.modules['abc'] size abc modül nesnesini verecektir.

+0

Teşekkürler, bu benim merak ettiğim şey. – mrip

+1

Ayrıca, eğer xyz 'abc'ye bağlıysa, muhtemelen modülün globals'ına kendi referansı vardır. Örneğin, xyz' bir işlev ise, xyz .__ globals__ 'abc .__ dict__' olacaktır ve' sys.modules 'girdisini silmemek 'xyz'' ye erişimi kaybetmeyecektir. garip etkiler). – user2357112

İlgili konular