Python IDLE 编辑器导入/as后没有自动补全列表
问题:
当我在开头加上 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 个回答
这个问题跟命名空间的内容有关,也就是要完成的名字是在哪个环境下被评估的。目前,这个环境是用户进程中的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,但这是一个我希望改进的设计。