如果两个模块相互导入会发生什么?
为了概括这个问题,Python中的循环导入怎么样?
我的PYTHONPATH中有一个看起来像这样的包:
package/
__init__.py
module.py
print 'Loading module'
Run Code Online (Sandbox Code Playgroud)
如果我从package/目录运行Python (或在此目录中编写另一个模块)并键入
import module
Run Code Online (Sandbox Code Playgroud)
它加载module.py并按预期打印出"加载模块".但是,如果我再输入
from package import module
Run Code Online (Sandbox Code Playgroud)
它加载module.py并再次打印"加载模块" ,这是我没想到的.这是什么理由?
注意:我认为我从技术上理解为什么Python会这样做,因为sys.modules键import module只是"module",但是对于from package import module它来说"package.module".所以我想我想知道的是为什么密钥在这里是不同的 - 为什么文件的路径名不是用作密钥,以便Python做到人们期望的呢?
在我们的项目中,我们使用以下模块进行级别"控制":'grid','gridcell','combo'等.网格模块导入gridcell模块,因为网格由单元格组成,而任何单元格都可以在其中包含组合.所以最初我们开始在这些类中使用'from ... import ...'语句,方法如下:
#grid.py
from controls.gridcell import cell
#gridcell.py
from controls.combo import combo
Run Code Online (Sandbox Code Playgroud)
但是在我们开始使用网格作为组合内容之前,这是可以的.一旦我们开始这样做,我们就需要将'from grid import grid'语句添加到'combo.py'中.执行此操作后,我们得到一个导入异常:
from controls.gridcell import gridcell
ImportError: Cannot import name gridcell
Run Code Online (Sandbox Code Playgroud)
编辑:
我也试过'import ... as ...'并得到以下错误:
import controls.gridcell as gridcell
AttributeError: 'module' object has no attribute 'gridcell'
Run Code Online (Sandbox Code Playgroud)
我已经阅读了几篇文章,我发现的关于如何解决这个问题的所有内容都是使用'import'语句,例如:
#grid.py
import controls.gridcell
#gridcell.py
import controls.combo
#combo.py
import controls.grid
Run Code Online (Sandbox Code Playgroud)
但这导致我们使用全名,如'controls.gridcell.cell','controls.combo.combo','controls.grid.grid'等.
所以我的问题是 - 有没有其他方法可以做到这一点(因此可以使用较短的名称)或者这是如何解决这个问题的唯一方法?
抱歉,如果我错过了什么
对所有人而言