PyCharm 中未使用的错误导入语句?

Posted

技术标签:

【中文标题】PyCharm 中未使用的错误导入语句?【英文标题】:False Unused Import Statement in PyCharm? 【发布时间】:2014-02-04 00:49:46 【问题描述】:

鉴于这种情况:

b.py:

import A
# A is unused here

c.py:

from b import A
# A is used here

PyCharm 在b.py 中抱怨import A 是未使用的导入,优化导入将其删除,从而破坏了c.py 中的导入。

我知道这些链式导入不是一个好习惯(尽管您可能会使用它来实现外观模块),但是是我还是 PyCharm 失败了?

【问题讨论】:

是你。如果您想解决此 IDE 行为,只需在您使用这些变量的位置添加一个 if False: 块,以便优化导入不会触及它们。 我正在处理一个大型项目中的现有代码。此外,我认为为了 IDE 编写代码并不是一个好主意。这是噪音,尤其是对于使用其他工具的贡献者。 "Fail" 有点苛刻,是一个小缺点,是的,但实际上没有任何方法可以轻松获得 100% 正确的行为(您可以随意混淆 A 的使用)。如果 A 在不应该删除的时候被删除,这就是你的 buildbot / jenkins / 持续集成设置应该立即解决的问题 【参考方案1】:

据我所知,此行为作为检查或其他可配置选项处理,这意味着在导入之前没有可以放置的 #noinspection UnusedImport(或等效项)。

如果您不想在使用这些变量的地方定义未使用的块,还有另一种简单且可能更好的方法来实现您想要的:

#b.py code
import A

# [...] your code


__all__ = ['A', ...]  # *all* the names you want to export

PyCharm 足够聪明,可以查看 __all__ 并避免将 A 作为未使用的导入删除。 但是有一个限制,__all__ 必须是简单的列表文字。你不能做这样的事情:

__all__ = ['A'] + [name for name in iterable if condition(name)]

甚至没有:

x = 'b'
__all__ = ['A', x]

定义__all__ 是确保您的模块*-import 安全的最佳实践,您应该已经这样做了。

【讨论】:

【参考方案2】:

您实际上可以使用PyUnresolvedReferences 标记来停用对您的导入语句的检查:

# noinspection PyUnresolvedReferences
import A

参考:PyCharm bug PY-2240

【讨论】:

这解决了我的问题!您的回答帮助我在codeoptimism.com/blog/pycharm-suppress-inspections-list 找到了包含所有标记的完整列表 谢谢,我正在寻找合适的 noinspection。我很遗憾与 codeoptimism 的链接不再起作用,一个列表会很棒。这似乎比接受的答案更有针对性。 @Scott – 如果有帮助,我发现了一个新链接 github.com/whitews/pc-inspection-suppression-list。【参考方案3】:
from C import A, B
_ = (A, B); del _

为我工作。我不喜欢

# noinspection PyUnresolvedReferences

因为如果 A 无法导入,它会给出假阴性。和

__all__ = ['A', 'B', ...]

晦涩难懂,不方便重构。

【讨论】:

以上是关于PyCharm 中未使用的错误导入语句?的主要内容,如果未能解决你的问题,请参考以下文章

PyCharm 的需求警告中未列出软件包

PyCharm 更新后显示错误的项目布局

表是现成的。 PyCharm 中未解析的表引用

android studio中未使用的导入

“SQLAlchemy”类中未解析的属性“Column”

PyCharm使用秘籍