【问题标题】:PyDev improperly warns of unused import statementPyDev 不正确地警告未使用的导入语句
【发布时间】:2013-05-09 09:07:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python eclipse pydev


    【解决方案1】:

    这里的正确答案是按照 PyDev 所说的去做。

    因为import ldap.sasl 总是导入ldap,所以import ldap 语句不是必需的,因此应该删除。


    至于 PyDev 声称如果您删除最后一行,两者都未使用......好吧,这绝对不是世界上最好的消息传递,但它并不是真的import ldap 是不必要的,因为您有 import ldap.sasl。但是import ldap.sasl 是不必要的,因为您从不使用它。诚然,如果您删除 import ldap.sasl,那么 import ldap 就不再是不必要的了,但警告不是关于您的代码的不同版本的真实情况,对吧?


    你说得对,tutorial section on Packages 根本没有解释这一点,而且 2.x 参考文档并没有真正直接说明它。

    但是,the import system 上的 3.x 参考文档专门描述了这种行为,并给出了示例(例如,请参阅“常规包”部分),而 2.x 参考确实直接引用了original package spec,其中说:

    每当加载包的子模块时,Python 会确保首先加载包本身,并在必要时加载其__init__.py 文件。包也是一样。因此,当 import Sound.Effects.echo 语句被执行时,它首先确保 Sound 被加载;然后它确保加载了 Sound.Effects;只有这样,它才能确保 Sound.Effects.echo 已加载(如果之前未加载,则加载它)。

    此外,所有现有的 Python 2.x 实现都按照 3.x 文档和原始包规范描述的方式进行操作,而且人们不太可能在未来创建全新的 2.x 实现,所以我认为您可以信赖这是一种保证。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2016-07-08
      • 2022-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多