这里的正确答案是按照 PyDev 所说的去做。
因为import ldap.sasl
总是 imports ldap
,所以该import ldap
语句不是必需的,因此应该删除。
至于 PyDev 声称如果你删除最后一行,两者都没有使用……嗯,这绝对不是世界上最好的消息传递,但它并没有错。是不必要的import ldap
,因为你有import ldap.sasl
. 但这import ldap.sasl
是不必要的,因为您从不使用它。诚然,如果您删除import ldap.sasl
,则import ldap
停止是不必要的,但警告不是关于您的代码的不同版本的真实情况,对吗?
没错,关于包的教程部分根本没有解释这一点,而且 2.x 参考文档并没有直接说明它。
但是,导入系统上的 3.x 参考文档专门描述了这种行为,并给出了示例(例如,请参阅“常规包”部分),而 2.x 参考确实直接引用了原始包规范,其中说:
每当加载包的子模块时,Python 会确保首先加载包本身,并__init__.py
在必要时加载其文件。包裹也是如此。因此,当 import Sound.Effects.echo 语句被执行时,它首先确保 Sound 被加载;然后它确保加载了 Sound.Effects;只有这样它才能确保 Sound.Effects.echo 被加载(如果之前没有加载过,则加载它)。
此外,所有现有的 Python 2.x 实现都按照 3.x 文档和原始包规范描述的方式进行操作,而且人们不太可能在未来创建全新的 2.x 实现,所以我认为你可以依赖以此为保证。
如果你想知道最初的基本原理,你必须阅读ni
Python 1.3 中的模块。(我没有它的链接。)如果你想知道为什么它在 2.7 中仍然如此,那是因为 Python 中的第一次彻底清理直到 3.0 才发生。如果您想知道为什么它在 3.0 甚至 3.3 中仍然import
如此(经过改进和进一步清理),您将不得不阅读有关PEP 328等importlib
关于python-ideas和python-dev的讨论. 当没有共识时改变一些东西(或者当讨论很少,甚至没有人认为有必要达成共识时),你不会在邮件列表之外获得 PEP 或任何其他“书面记录”。如果我没记错的话,它确实是在讨论成为 PEP 328 的相对与绝对导入想法时顺便提出的,但没有人认为这是一个需要解决的问题。