ChatGPT解决这个技术问题 Extra ChatGPT

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

我在 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 中找不到参考“选择”

我在谷歌上搜索,想知道这是什么意思,我应该怎么做才能在 Python 中正确编码。

请注意,在我的情况下,只需重新启动 PyCharm 即可在 macOS 10.13.3、PyCharm Professional 2017.3.3 上解决此警告消息。
我只是发现当我用 pip 安装 numpy 时会发生这种情况。如果我直接通过 Pycharm 单独安装它,则没有问题。
建议的解决方案都不适合我。我最终使用了与 PyCharm 配合得更好的 Anaconda。然后破解模块的 __ init __.py 以包含 __all __ = [whatsimported] 作品。

3
3 revs

这是 pycharm 中的一个错误。 PyCharm 似乎期望引用的模块包含在 __all__ = [] 语句中。

为了遵守正确的编码礼仪,您是否应该在模块中包含 __all__ 语句? ..这实际上是我们听到年轻的Spock在接受测试时回答的问题,他回答说:“这在道德上值得称赞,但在道德上不是强制性的。”

要绕过它,您可以简单地全局禁用该(非常非关键)(非常有用)检查,或针对特定功能或语句禁止它。

为此:

将插入符号放在错误文本上(“选择”,来自您上面的示例)

调出意图菜单(默认为alt-enter,我的设置为alt-backspace)

点击右箭头打开子菜单,然后选择相关操作

PyCharm 也有类似这样的小错误,但在我看来,它的好处远远超过它的缺点。如果您想尝试另一个好的 IDE,还有 Spyder/Spyderlib。

在您提出问题后,我知道这是相当多的,但我希望这对您(您或其他人)有所帮助。

已编辑:最初,我认为这是特定于检查 __all__,但看起来它是更通用的“未解决的引用”检查,这可能非常有用。最好使用该功能的语句级禁用,方法是使用上面提到的菜单,或者在语句前面的行上指定 # noinspection PyUnresolvedReferences


S
Sнаđошƒаӽ

您应该首先查看 this。这解释了导入包时会发生什么。为了方便:

import 语句使用以下约定:如果包的 __init__.py 代码定义了一个名为 __all__ 的列表,则当遇到 from package import * 时,它将被视为应导入的模块名称列表。当包的新版本发布时,由包作者保持这个列表是最新的。包作者也可能决定不支持它,如果他们没有看到从他们的包中导入 * 的用途。

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

__init__.py

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

添加后,您可以ctrl+click在项目的任何其他部分中使用的这些模块名称上直接跳转到声明,我经常觉得这非常有用。


我同意该警告不是错误,但您无法 ctrl+单击该模块的事实可以修复
@user110954 PyCharm 可能会查看 __init__.py 文件以回溯到函数/变量所在的模块。因此,如果没有 __all__ 的模块名称,它就无法回溯到源。这是我的假设,我可能错了。
如果支持 __all__ 不是强制性的并且 PyCharm 产生错误,那么是的,这是一个错误,因为这不是错误。 PyCharm 可以简单地发出警告。
p
per1234

我知道这是旧的,但谷歌把我送到这里,所以我猜其他人也会像我一样来。

2018 年的答案是这里选择的一个:Pycharm: "unresolved reference" error on the IDE when opening a working project

请注意,您只能添加一个 Content Root,但您可以添加多个 Source Folders。无需触摸 __init__.py 个文件。


这应该是公认的答案!当前的只是不起作用,而这确实
添加为源根目录并修复了警告
a
absin

您可以像这样将源目录标记为源根目录:

右键单击源目录

将目录标记为 --> 源根目录

文件 --> 使缓存无效/重新启动... -> 使缓存无效并重新启动


T
Tonechas

我从 cv2 文件夹中复制了 cv2.pyd 并将其粘贴到 site-packages 文件夹中,这解决了问题。

参考图片:

https://i.stack.imgur.com/cLEAT.png

https://i.stack.imgur.com/abNKb.png


L
Lucas Crostarosa

好吧,我在这里真的超越了自己....我尝试导入的文件末尾没有 .py 扩展名


M
Maximus Besman

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

检查选择的源路由。它帮助我用 ctrl+click 解决了这个问题。


J
Julienm

当在同一个窗口 2 中附加项目时,它在 PyCharm 中发生在我身上:

一个项目使用具有较新 Python 版本(例如 3.6)的 Python 解释器

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

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


S
Shukrullo

这发生在我的 websockets 库中,但似乎是一个更普遍的问题。示例:在“init.py init.py”中找不到引用“异常”

这对我有用:从 websockets 导入异常


X
Xavier

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

要解决此问题,请在 Settings > Editor > File Types 中,在“可识别的文件类型”列表中单击“文本”,然后在“文件名模式”列表中删除 __init__.py