2016-07-22 76 views
3

我有一個包含一個名爲Ÿ如果X在X中有多個Y,則Python如何解析「從X導入Y」?

一個兩回事包X是一個模塊:

# X/Y.py 
print 'hello' 

另一種是一個變量:

# X/__init__.py 
Y = 'world' 

如果我執行from X import Y其中Y做我得到和爲什麼?什麼決定了導入語句的順序和影子規則?

最後,有什麼我可能會意外地做,將改變答案?

基本上,我得到一個錯誤報告,指出在用戶的機器上這個代碼導致從我的機器上得到的相反的Y導入。我沒有訪問用戶的機器,所以我想弄清楚發生了什麼。

如果在此之前的問題線索,我想知道: python: from x import y changes previous import result

回答

5

包中的模塊一旦導入,也會被設置爲父模塊對象的屬性。然而,from module import name語法將的第一個看着導入的模塊對象(全局變量X)的屬性來解析name

所以,答案是,這取決於。如果您尚未導入X.Y模塊,則最終將以Y綁定到'world'。如果您已導入X.Y(與import X.Yfrom X.Y import some_name),則Y綁定到X.Y子模塊。後者是YX已被設置爲一個全球性的副作用。

演示:

$ mkdir foo 
$ cat <<EOF> foo/__init__.py 
> bar = 'from the foo package' 
> EOF 
$ cat <<EOF> foo/bar.py 
> baz = 'from the foo.bar module' 
> EOF 
$ bin/python -c 'from foo import bar; print(bar)' 
from the foo package 
$ bin/python -c 'import foo.bar; from foo import bar; print(bar); print(bar.baz)' 
<module 'foo.bar' from 'foo/bar.py'> 
from the foo.bar module 
1

模塊中的名稱爲準。從the Python tutorial

請注意,從包導入項目使用時,該項目可以是包的子模塊(或子包),也可以是包中定義的其他名稱,如函數,類或變量。導入語句首先測試項目是否在包中定義;如果不是,它假定它是一個模塊並嘗試加載它。

相同的信息在the language reference中給出。但是,如果任何代碼導入子模塊(通過其他更明確的方式,例如import X.Y,其中Y只能引用模塊),那麼該子模塊也將作爲包中的名稱存在。所以在這種情況下,它將取決於代碼的順序:一旦你導入模塊,它將覆蓋相同名稱的變量。

-1

Python的首先查找關於X文件夾下的任何文件Y.py當前的工作目錄,那麼它會查找X包導入Ÿ文件安裝庫。 如果包X中有一個Y變量,那麼它將被導入,然後被該包的文件Y.py上的內容替換

相關問題