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

时间:2015-09-29 16:04:15

标签: python python-2.7 packages python-import

以下代码打印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 bug还是......?
  3. 编辑:

    可能是一个wx,如下所示没有警告:

    import os.path
    
    print os.name
    

    但是Q1仍然存在

    EDIT2:

    将导入更改为

    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
    

1 个答案:

答案 0 :(得分:4)

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地图。