Python通配符导入Vs Named Imp

2024-10-01 09:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我在我的一个项目中有一些奇怪的行为,我希望有人能告诉我原因。我的文件结构如下:

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

内部py大型机我定义了一个名为RPMWindow的类,它扩展了wx.框架. 在

在MainApp.py这是有效的:

^{pr2}$

但这并不是:

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

当使用通配符导入时,我不会收到回溯,我的应用程序将打开。在


Tags: andinfrompyimportsettingslineres
3条回答

我没有时间来研究为什么通配符对您有效,但是对于您的直接名称导入失败,我可以说的是您的代码中有一个导入周期:

您正在尝试导入res.elements.MainFrame,但部分代码正在尝试导入res.elements.MenuBar,它试图再次导入res.elements.MainFrame。您看,您第一次导入res.elements.MainFrame的尝试尚未完成,然后重试。在

您的代码中有循环导入:同一个模块既是某个模块所必需的,又需要使用另一个模块,当您这样想时,它显然是不稳定的。大多数问题都可以通过使用import a和稍后引用a.b而不是from a import b或{}来解决。在

尤其是,从不使用from a import *。通配符导入会使名称空间混乱,使代码的可维护性、可读性、理智性和可预测性降低。import afrom a import *之间的区别在于将一个盒子拖进房间和把里面的东西倒在地板上的区别。在

如果您可以将共享代码移到它自己的模块中,或者以某种方式重构以消除循环导入的需要,那就更好了。循环导入总是指示设计问题。在

您有循环导入:

在大型机.py是间接导入MainApp.py,和MainApp.py正在导入大型机.py. 结果,什么时候MainApp.py正在导入大型机.py,RPMWindow类尚未定义,您将得到ImportError。在

相关问题 更多 >