【问题标题】:Python - why importing a submodule makes the package visible?Python - 为什么导入子模块会使包可见?
【发布时间】:2015-12-27 05:10:53
【问题描述】:

下面的代码打印 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 仍然存在

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

【问题讨论】:

    标签: python python-2.7 packages python-import


    【解决方案1】:

    import wx.gizmos 行首先导入 wx 包(如果之前未加载,则将其存储在 sys.modules['wx'] 中,然后还导入 wx.gizmos 模块并使其成为 sys.modules['wx'] 对象的属性。Python 然后绑定wxsys.modules['wx']

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

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

    【讨论】:

    • 嗯 - 听起来像一个 Pycharm 错误 - 导致取消注释 import wx 警告消失了 - 所以当我发出 import wx 它做正确的事情。值得一个错误报告。我相信你的回答涵盖了我的第二次编辑:)
    • 嗯 - docs.python.org/2/reference/… 中缺少所有这些信息 - 任何记录此内容的链接都将是一个很好的补充:)
    • @Mr_and_Mrs_D:这里的问题是 PyCharm 如何分析您的代码并提供警告。这不是 Python 的问题,而是 IDE 的问题。
    • 是的,当然——我的意思是这是一个 IDE 错误 :)(这是警告部分)。您能否添加一个链接,其中分析“点”导入的分辨率,因为 docs.python.org/2/reference/… 不包含您提供的信息
    • 关于在 Python 2 中导入的文档状态有点……混乱,目前我没有更好的参考资料供您参考。
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2012-03-07
    • 2011-01-25
    • 2016-01-20
    • 2011-04-16
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多