【问题标题】:False Unused Import Statement in PyCharm?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 / 持续集成设置应该立即解决的问题

标签: python pycharm


【解决方案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

    【讨论】:

    【解决方案3】:
    from C import A, B
    _ = (A, B); del _
    

    为我工作。我不喜欢

    # noinspection PyUnresolvedReferences
    

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

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

    晦涩难懂,不方便重构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多