2016-04-07 13 views
9

Domanda sugli interni di Python. Se eseguo import abc, Python legge il modulo in un nuovo spazio dei nomi e lega la variabile abc nello spazio dei nomi globale per fare riferimento al nuovo spazio dei nomi.Eseguendo `da abc import xyz` dove va il modulo` abc`?

Se eseguo from abc import xyz allora legge l'intero modulo abc in qualche nuovo spazio dei nomi e quindi si lega la variabile xyz nel namespace globale allo stesso oggetto che è destinato a xyz in questo spazio dei nomi appena creato in cui il modulo è stato letto in. Almeno questa è la mia comprensione.

Cosa succede al dominio in cui è stato letto abc in seguito? Suppongo che viva da qualche parte, perché xyz potrebbe accedere ad altri oggetti in quello spazio dei nomi. È possibile accedere a questo spazio dei nomi "ghost" abc in qualche modo?

Inoltre, sto supponendo che se faccio

from abc import xyz 
from abc import fgh 

allora c'è solo un "fantasma" abc spazio dei nomi, in modo che se xyz e fgh modificare la stessa variabile globale in abc, ci sarà solo una copia di esso. È corretto?

+1

È solo per curiosità? Non c'è una vera ragione per provare ad accedere al modulo "segretamente" come questo; se si desidera accedere all'oggetto modulo, è sufficiente importarlo normalmente. – BrenBarn

+0

Solo per curiosità, cercando di capire come funzionano le cose sotto il cofano. Faccio un sacco di lavoro sui dati, pensando di spostare parte di questo lavoro da R a Python, quindi solo costruendo una comprensione. – mrip

risposta

6

L'oggetto modulo viene memorizzato in sys.modules. Quindi se lo fai from abc import xyz, allora sys.modules['abc'] ti darà l'oggetto modulo abc.

+0

Grazie, questo è esattamente quello che stavo chiedendo. – mrip

+1

Inoltre, se 'xyz' dipende da' abc', probabilmente ha il proprio riferimento ai globali del modulo. Ad esempio, se 'xyz' è una funzione,' xyz .__ globals__' sarà 'abc .__ dict__', e l'eliminazione della voce' sys.modules' non renderà 'xyz' l'accesso a tale (anche se avrà altro effetti strani). – user2357112

Problemi correlati