0

我在一个模块中有以下 Python 代码:

import ldap
import ldap.sasl
x = ldap.VERSION3
y = ldap.sasl.gssapi

Eclipse(使用 PyDev)警告我我的第一个导入语句未使用。但它显然被使用了。Python 显然隐式地导入了父包——我觉得这很奇怪,因为 Python 更喜欢显式的,而且我在文档中找不到任何提及这一点。但这并不意味着我没有使用第一个。更奇怪的是,如果我删除最后一行,PyDev 声称两个导入语句都未使用。(我认为最后一种情况显然是 PyDev 中的一个错误。)

所以我的问题是,有没有办法关闭第一行的警告,而不关闭所有未使用的导入的警告?而且我宁愿不要用@UnusedImport注释污染我的代码。

4

1 回答 1

1

这里的正确答案是按照 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 实现,所以我认为你可以依赖以此为保证。


如果你想知道最初的基本原理,你必须阅读niPython 1.3 中的模块。(我没有它的链接。)如果你想知道为什么它在 2.7 中仍然如此,那是因为 Python 中的第一次彻底清理直到 3.0 才发生。如果您想知道为什么它在 3.0 甚至 3.3 中仍然import如此(经过改进和进一步清理),您将不得不阅读有关PEP 328importlib关于python-ideaspython-dev的讨论. 当没有共识改变一些东西(或者当讨论很少,甚至没有人认为有必要达成共识时),你不会在邮件列表之外获得 PEP 或任何其他“书面记录”。如果我没记错的话,它确实是在讨论成为 PEP 328 的相对与绝对导入想法时顺便提出的,但没有人认为这是一个需要解决的问题。

于 2013-05-14T23:03:06.483 回答