我在模块中获得了以下Python代码:
import ldap
import ldap.sasl
x = ldap.VERSION3
y = ldap.sasl.gssapi
Eclipse(使用PyDev)警告我,我的第一个import语句未使用。但它显然被使用了。 Python显然是隐式导入父包 - 我觉得很奇怪,因为Python更喜欢显式,我在文档中找不到任何提及。但这并不意味着我没有使用第一个。更奇怪的是,如果我删除最后一行,PyDev声称导入语句的两个都未使用。 (我认为最后一个案例显然是PyDev中的一个错误。)
所以我的问题是,有没有办法关闭第一行的警告,而不关闭所有未使用的导入的警告?而且我不想用@UnusedImport
评论来污染我的代码。
答案 0 :(得分: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引用直接引用{{ 3}},其中说:
每当加载包的子模块时,Python都会确保首先加载包本身,并在必要时加载其
__init__.py
文件。包裹也一样。因此,当语句导入Sound.Effects.echo执行时,它首先确保加载声音;然后它确保加载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
改进并进一步清理之后),你将不得不阅读围绕{{{在original package spec和PEP 328上有3}},importlib
等。如果有一个共识不来改变某些东西(或者当讨论很少,甚至没有人认为有必要要求达成共识时),那么你就不会在外面得到PEP或任何其他“文件记录”邮件列表。如果我没记错的话,在讨论成为PEP 328的相对与绝对导入思想时确实提出了这个问题,但是没有人认为这是一个需要修复的问题。