无法在__init__.py中找到引用'xxx'

126

我在PyCharm中有一个项目,组织方式如下:

-- Sources
   |--__init__.py
   |--Calculators
      |--__init__.py
      |--Filters.py
   |--Controllers
      |--__init__.py
      |--FiltersController.py
   |--Viewers
      |--__init__.py
      |--DataVisualization.py
   |--Models
      |--__init__.py
      |--Data

我的__init__.py中除了紧挨着Sources的那个文件之外,其他都是空文件。我收到了很多这样的警告:

在 __init__.py 中找不到引用“xxx”

例如,我的FiltersController.py有这段代码:

import numpy.random as npr

bootstrap = npr.choice(image_base.data[max(0, x-2):x+3, max(0, y-2):y+3].flatten(), size=(3, 3), replace=True)

我收到了以下警告:

在__init__.py中找不到'reference'为'choice'的引用。

我正在搜索,想知道这意味着什么以及我应该如何正确编写Python代码。


4
仅供参考,我遇到过同样的警告信息,在macOS 10.13.3和PyCharm Professional 2017.3.3上,简单地重新启动PyCharm解决了这个问题。 - viz
1
我发现当我使用pip安装numpy时会出现这种情况。如果我直接通过Pycharm单独安装它,就没有问题。 - joshmcode
没有任何提供的解决方案能够解决我的问题。最终我使用了 Anaconda,它与 PyCharm 更加兼容。然后通过修改模块的 init.py 文件,添加 all = [whatsimported] 的方式使其工作。 - Albert Hendriks
10个回答

138
这是pycharm中的一个bug。 PyCharm似乎期望被引用的模块应该包含在一个__all__ = []语句中。
为了遵守适当的编码礼仪,您应该在模块中包括__all__语句吗?实际上这是年轻的斯波克在被测试时所回答的问题:“道德可赞美,但不是道德义务。”
要解决这个问题,您可以全局禁用这个(极少出现的)(非常有用的)检查,或者对特定的函数或语句进行抑制。
操作步骤如下:
将光标放在出错的文本(从您上面的示例中的‘choice’)上 打开意图菜单(默认情况下是alt-enter, 我的设置为alt-backspace) 按右箭头打开子菜单,然后选择相关动作
PyCharm有其小bug,但在我看来,它的好处远远超过了缺点。如果您想尝试另一个好的IDE,则还有Spyder/Spyderlib。
编辑:最初,我认为这是检查__all__的特定情况,但看起来它是更一般的'未解析的引用'检查,这可能非常有用。最好使用语句级别禁用该功能,可以通过上述菜单或在语句前面指定# noinspection PyUnresolvedReferences来实现。

作为一个非英语母语的人,我不理解第二段的内容。 - Rémy Hosseinkhan Boucher
作为一个非英语母语的人,我不理解第二段的内容。 - undefined
这是一个《星际迷航》的参考。这是文化,不是语言。 =;o) - undefined

29

你应该首先查看这里。它解释了导入包时会发生什么。为方便起见:

导入语句使用以下约定:如果一个包的 __init__.py 代码定义了一个名为 __all__ 的列表,则认为这是应在遇到 from package import* 时导入的模块名称列表。当发布包的新版本时,由包作者负责将此列表保持最新状态。如果包作者不认为从其包中导入*有用处,则可以选择不支持它。

因此,PyCharm通过显示警告消息来尊重这一点,以便作者可以决定在导入包中的*时导入哪些模块。因此,这似乎是PyCharm的一个有用功能(我认为这绝对不能被称为错误)。您可以通过将要导入的模块的名称添加到 _all__ 变量中来轻松删除此警告,该变量是列表,如下所示:

__init__.py

from . import MyModule1, MyModule2, MyModule3
__all__ = [MyModule1, MyModule2, MyModule3]

添加此内容后,您可以在项目的任何其他部分上 ctrl+click 以直接跳转到声明,我经常发现这非常有用。


4
我同意这个警告不是一个错误,但不能使用Ctrl+点击那个模块的事实可以被修复。 - user110954
@user110954 或许 PyCharm 会查看 __init__.py 文件以追溯到函数/变量所在的模块。因此,如果没有 __all__ 中包含模块名称,它就无法追溯到源代码。这是我的假设,我可能是错的。 - Sнаđошƒаӽ
1
如果支持__all__不是强制性的,而PyCharm产生了一个错误,那么是的,这是一个bug,因为那不是一个错误。PyCharm可以简单地发出一个警告。 - user118967
但是关键是:这只是一个代码检查器的“警告”,而不是“错误”。 - undefined

21

这应该是被接受的答案!当前的答案不起作用,而这个可以。 - Gulzar
已将其添加为源根目录,这样就修复了警告。 - Gustavo
再次回到这里,我现在意识到答案应该是独立的,而不仅仅是一个链接。请编辑一下 :) - Gulzar

19
为了解决这个问题,你应该将源目录标记为源根目录。虽然不清楚为什么要这么做,但它很重要。
具体操作如下:
  • 右键点击源目录
  • 标记目录为 --> 源根目录
  • 文件 --> 无效缓存 / 重新启动... -> 无效并重启

3
我从cv2文件夹中复制了cv2.pyd,并将其粘贴到site-packages文件夹中,这就解决了问题。
参考图片: Image-1 Image-2

1

我在这里真的超水了....我尝试导入的文件结尾没有.py扩展名。


0

如果您在PyCharm中将多个独立项目添加到一个项目中,并将不同的项目标记为源路由,则可能出现此问题。

检查所选的源路由。这有助于我解决ctrl+click的问题。


0
这个问题发生在我使用websockets库时,但似乎是一个更普遍的问题。 例如:在'init.py init.py'中找不到'reference' 'exceptions'。
以下方法对我有效: from websockets import exceptions

0

在PyCharm中,我遇到了一个问题,当在同一个窗口中有两个附加的项目时,其中:

  • 一个项目使用较新版本(例如3.6)的Python解释器
  • 另一个项目使用较旧版本(例如2.7)的Python解释器

我必须分离其中一个项目来解决指向错误Python版本的引用。


-1

请确保您没有错误地更改了__init__.py文件的文件类型。例如,如果您将它们的类型更改为“文本”(而不是“Python”),PyCharm将无法分析Python代码文件。在这种情况下,您可能会注意到__init__.py文件的文件图标与其他Python文件不同。

要解决此问题,请在设置>编辑器>文件类型中,在“已识别文件类型”列表中单击“文本”,并在“文件名模式”列表中删除__init__.py


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接