2010-04-19 31 views
4

好吧,我的一個項目中有一些相當奇怪的行爲,我希望有人能告訴我爲什麼。我的文件結構如下所示:Python通配符導入與命名導入

MainApp.py 
res/ 
    __init__.py 
    elements/ 
    __init__.py 
    MainFrame.py 

MainFrame.py內部我定義了一個名爲RPMWindow的類,它擴展了wx.Frame。

在MainApp.py這個工程:

from res.elements.MainFrame import * 

這並不:

from res.elements.MainFrame import RPMWindow 

我意識到通配符進口不會傷害任何東西,但我更感興趣的是理解當通配符成功時爲什麼命名導入失敗。

當使用類的名字,我得到這個回溯:

Traceback (most recent call last): 
    File "C:\myApps\eclipse\plugins\org.python.pydev.debug_1.5.6.2010033101\pysrc\pydevd.py", line 953, in <module> 
    debugger.run(setup['file'], None, None) 
    File "C:\myApps\eclipse\plugins\org.python.pydev.debug_1.5.6.2010033101\pysrc\pydevd.py", line 780, in run 
    execfile(file, globals, locals) #execute the script 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\MainApp.py", line 2, in <module> 
    from res.elements.MainFrame import RPMWindow 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\res\elements\MainFrame.py", line 2, in <module> 
    from res.elements.MenuBar import MenuBarBuilder 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\res\elements\MenuBar.py", line 2, in <module> 
    from MainApp import _, DataCache 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\MainApp.py", line 2, in <module> 
    from res.elements.MainFrame import RPMWindow 
ImportError: cannot import name RPMWindow 

當使用通配符輸入我沒有收到回溯和我的應用程序打開。

+1

您能否提供使用命名導入時獲得的實際回溯? – 2010-04-19 17:52:46

+0

請指出「這不起作用」的含義。第一種情況下你是否真的進口了RPMWindow? – joaquin 2010-04-19 17:53:25

回答

8

你有圓形進口:

MainFrame.py間接進口MainApp.py,並MainApp.py是進口MainFrame.py。因此,當MainApp.py導入MainFrame.py時,RPMWindow類尚未定義,並且會出現ImportError。

+0

我發現這個是你指出的。我想我已經解決了。謝謝。 – Dan 2010-04-19 18:05:21

+0

隨便提醒爲什麼通告進口不是一個好習慣! – jathanism 2010-04-19 22:50:00

0

我沒有時間去考慮爲什麼通配符是爲你工作,但我可以說一下與直接進口的名字你的失敗是,你必須在你的代碼的導入週期:

您正試圖導入res.elements.MainFrame,但的一部分,代碼正試圖導入res.elements.MenuBar,它試圖再次導入res.elements.MainFrame。 IOW,您第一次嘗試導入res.elements.MainFrame尚未完成,然後再次嘗試。

0

您的代碼中有循環導入:同一個模塊既是必需的,也需要使用某個其他模塊,當您這樣想時,它顯然是不穩定的。大多數問題可以通過使用import a並稍後參考a.b而不是from a import bfrom a import *來清除。

特別是,從來沒有使用from a import *。通配符導入混亂您的名稱空間,並使您的代碼更易於維護,可讀,理智和可預測。 import afrom a import *之間的區別在於將箱子拖入房間並將其內容物傾倒在地板上。

如果您可以將共享代碼移到其自己的模塊或以某種方式重構循環導入的需要,那將會更好。循環進口總是表明設計問題。