Python IDLE 编辑器导入/as后没有自动补全列表

0 投票
1 回答
2797 浏览
提问于 2025-04-19 08:40

问题:

当我在开头加上 import winreg as wr 时,winreg 的自动补全功能可以用,但 wr 的却不行。

我尝试过的

  • 在点之后等了2秒或者按 Control+Space 来触发自动补全框
  • 卸载了 Python 2.7 和 3.4,然后重新安装了 Python 3.4,因为我最开始用的是 2.7,后来改了很多注册表项来切换到 3.4
  • 在命令行窗口中,winreg 的自动补全功能可以用,甚至不用导入它,但当我用 wr 导入后,wr 的自动补全可以用,为什么在 IDLE 编辑器里就不行呢?
  • 创建了一个新的 .py 文件来测试 import/as 的用法
  • 在我的 Windows 7 和 Windows 8 电脑上试过,问题一样

版本信息

  • Python 3.4
  • IDLE 3.4
  • Windows 7/8

示例

import winreg as wr

#IDLE behavior: bad
winreg. #autocomplete box is shown
wr. #no autocomplete box

#Runtime behavior: good
print(wr.REG_LINK) #no error, prints 6
print(winreg.REG_LINK) #raises exception, which is good

这是个bug,还是我做错了什么,我能修复吗?

你能推荐一个轻量级的 Python IDE 或者更好的 Notepad++ 自动补全插件吗?

如果你需要其他信息,请告诉我。

提前谢谢你!

1 个回答

0

这个问题跟命名空间的内容有关,也就是要完成的名字是在哪个环境下被评估的。目前,这个环境是用户进程中的sys.modules和globals的组合,如果没有用户进程,就用Idle进程。想了解更多,可以查看这个CPython的问题追踪。另外,在帮助文档的Tips部分也有关于补全的内容。我不太确定你具体做了什么,但我可以告诉你我得到的结果,这和文档中的内容是对应的。

在Windows 7上安装了3.4.1版本,在Shell中。

>>> winreg.

这个能工作是因为Windows上的Idle会导入winreg。虽然它不在globals中,但它在sys.modules里。我觉得这部分是个bug,但我明白sys.modules被用作一种临时解决方案,直到找到更好的方法。

>>> wr.

这个不行,因为'wr'不在sys.modules中(而且永远不会在),也不在globals()里。

>>> import winreg as wr

在交互模式下,这个会立即执行,并把'wr'添加到globals中。

>>> wr.

现在可以工作了,因为'wr'现在globals中了。

现在,在一个文件中:

import winreg as wr

这个不会立即执行。

wingreg.

对我来说可以工作,原因和之前一样,所以我不太理解你的报告。

wr.

对我来说不行,原因和之前一样。现在去掉那两行代码再运行文件。现在'wr.'可以工作了,因为运行文件会把'wr'添加到globals中。但是运行另一个文件会重置globals,'wr'可能不会被包含在内,或者可能指向错误的对象。所以,我无法重现任何实现上的bug,但这是一个我希望改进的设计。

撰写回答