2016-11-19 29 views
0

我已经对该声明进行了实验,但结果与官方说明不符。 Quotation低于:什么是“从...进口”表格的确切语义?

的形式从使用一个稍微复杂的过程:

  1. 找到从子句,装在指定的并在必要时对其进行初始化的模块;
  2. 每个在进口子句指定的标识符:
    1. 检查,如果导入的模块有这个名字的属性
    2. 如果没有,尝试导入一个子模块具有该名称,然后检查导入的模块再次针对该属性
    3. 如果未找到该属性,则会引发ImportError。
    4. 否则,该值的参考被存储在本地名称空间中,在使用的名称为第如果其存在,否则使用的属性名称

我创建了一个名称空间包命名为l007,其中放置了名为l009的子模块。我在解释器中键入“from l007 import l009”,执行正常,而在这种情况下,应该引发ImportError。 我理解错了吗?

+0

为什么你认为应该提高ImportError? – BrenBarn

+0

模块l009没有与官方描述对应的名为l009的属性。 –

回答

1

参见this documentation

当子模块使用任何机构加载(例如importlib API中,importimport-from语句,或者内置__import__())被放置在父模块的名字空间给子模块的结合目的。例如,如果包spam具有子模块foo,则在导入spam.foo后,spam将具有绑定到子模块的属性foo

这就是为什么在您的报价的步骤在他们的顺序。即使l007最初没有属性l009,就会有一个子模块导入后发生。

相关问题