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 中未使用的错误导入语句?的主要内容,如果未能解决你的问题,请参考以下文章