2012-10-06 73 views
2

我注意到python處理模塊名稱的一個特殊行爲。Python:「import ... as」導致引用不正確

如果我寫:

import a.b 
import a 

,然後嘗試引用模塊A·B的東西,它的工作原理沒有問題。

不過,如果我嘗試的東西只是略有不同:

import a.b 
import c as a 

,然後嘗試引用模塊AB東西,我得到一個錯誤,他說:

AttributeError: 'module' object has no attribute 'b'

我明白明顯解決方案僅僅是沒有兩個不同的模塊,我使用相同的名稱。不過,我仍然很好奇導致這種行爲變化的原因。爲什麼一個人工作,而不是另一個?

+0

是不是正確的方式來導入的東西將是「從模塊導入模塊/類/無論」?編輯:nm錯誤格式化導致我寫這個評論。 –

+0

在文章中包含代碼時,使用Ctrl-K或編輯器的代碼示例按鈕,所有換行符和間距都將正確顯示,並且還會顯示語法高亮顯示。 –

回答

3

如果你import c as a

它將覆蓋以前的a

因此,如果您嘗試調用a.b你真的叫c.b

+0

uhm .....是:) – Bastian

11

爲什麼你期望它的工作?所有4個進口報表都是分配給變量a。因此,如果您分配ca,它覆蓋的東西的內容不具有.b屬性。


下面是在第一種情況下會發生什麼:

  1. import a.b運行,Python的負載模塊a,然後加載模塊a.b到加載a模塊的屬性b。然後它將結果賦給變量a
  2. import a不會導入任何新的東西,因爲模塊a已經加載。它只是將sys.modules['a']中的同一個模塊重新分配到a

這裏是在第二種情況下會發生什麼:

  1. import a.b運行,Python的負載模塊a,然後加載模塊a.b到加載a模塊的屬性b。然後它將結果賦給變量a
  2. 當運行import c as a,它加載模塊c,然後將該模塊分配給變量a覆蓋內容(a = sys.modules['c'])。您可以通過比較sys.modules['a']的內容和a的內容來驗證這一點 - 在這種情況下它們會有所不同。
+0

這使得很多自從。我最近一直在使用java,所以我認爲「a」和「a.b」是相互獨立的。我沒有想到模塊被存儲爲對象,並且我覆蓋了它們。 謝謝。 –

3

在第一種情況下,a指實際包a(其中包含模塊b)。這意味着a.b是指a包含的內容。

在第二種情況下,a是指模塊c.py。就好像你試過import c; a = c。現在,如果c沒有屬性b,它將會失敗。

2

當你做一個「導入爲」語句,你真的在​​做一個任務。所以,如果你這樣做

import matplotlib as mp 

要指定爲matplotlib的命名空間mp

這帶有轉讓的所有常見含義。

相關問題