Python - 为什么导入子模块会使包可见?

Python - why importing a submodule makes the package visible?

下面的代码打印 wx.ACCEL_NORMAL 好吧

import wx.gizmos

# import wx # uncommenting this the warning is eliminated

print wx.ACCEL_NORMAL # Pycharm warns: "Cannot find reference 'ACCEL_NORMAL'
# in imported module wx" but finds it alright when i run it

两个问题:

  1. 它怎么会看到wx?
  2. 为什么会发出警告?它与 wx (2.8.12.1) 特性有关,还是可以预料的,或者它是 Pycharm 错误还是...?

编辑:

可能是以下 wx 问题没有发出警告:

import os.path

print os.name

但 Q1 仍然有效

编辑 2:

将导入更改为

import wx.gizmos as gizmos

我得到了预期的结果:

Traceback (most recent call last):
  File "/home/utumno/.PyCharm40/config/scratches/scratch", line 5, in <module>
    print wx.ACCEL_NORMAL # Pycharm warns: "Cannot find reference 'ACCEL_NORMAL'
NameError: name 'wx' is not defined

import wx.gizmos首先导入wx包(如果之前没有载入则存放在sys.modules['wx']中,然后还导入wx.gizmos模块并使其成为一个属性sys.modules['wx'] 对象。Python 然后将 wx 绑定到 sys.modules['wx'].

因此,您最终在代码中得到了全局名称 wx,您可以通过它引用 wx.gizmos

PyCharm的警告这里可以忽略; IDE 使用的静态分析应该考虑到导入 wx.gizmos 使得 wx 可用。这对 wx.gizmos 失败而对 os.path 有效可能是由于多种因素造成的;也许 PyCharm 开发人员将 os 处理硬编码到分析器中(因为导入 os.path 是如此常见),或者 wx 命名空间被实现为 C 扩展,这意味着静态分析必须依赖预先计算的可用名称地图,也许 wx 地图未在此处加载。