gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:41:08 25 4
gpt4 key购买 nike

下面的代码可以打印出 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'] 中之前,then 还导入了 wx.gizmos 模块并使它成为 sys.modules['wx'] 对象的属性。Python 然后绑定(bind) wxsys.modules['wx']

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

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

关于Python - 为什么导入子模块会使包可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32848754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com