我在 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 中的一个错误。 PyCharm 似乎期望引用的模块包含在 __all__ = []
语句中。
为了遵守正确的编码礼仪,您是否应该在模块中包含 __all__
语句? ..这实际上是我们听到年轻的Spock在接受测试时回答的问题,他回答说:“这在道德上值得称赞,但在道德上不是强制性的。”
要绕过它,您可以简单地全局禁用该(非常非关键)(非常有用)检查,或针对特定功能或语句禁止它。
为此:
将插入符号放在错误文本上(“选择”,来自您上面的示例)
调出意图菜单(默认为alt-enter,我的设置为alt-backspace)
点击右箭头打开子菜单,然后选择相关操作
PyCharm 也有类似这样的小错误,但在我看来,它的好处远远超过它的缺点。如果您想尝试另一个好的 IDE,还有 Spyder/Spyderlib。
在您提出问题后,我知道这是相当多的,但我希望这对您(您或其他人)有所帮助。
已编辑:最初,我认为这是特定于检查 __all__
,但看起来它是更通用的“未解决的引用”检查,这可能非常有用。最好使用该功能的语句级禁用,方法是使用上面提到的菜单,或者在语句前面的行上指定 # noinspection PyUnresolvedReferences
。
您应该首先查看 this。这解释了导入包时会发生什么。为了方便:
import 语句使用以下约定:如果包的 __init__.py 代码定义了一个名为 __all__ 的列表,则当遇到 from package import * 时,它将被视为应导入的模块名称列表。当包的新版本发布时,由包作者保持这个列表是最新的。包作者也可能决定不支持它,如果他们没有看到从他们的包中导入 * 的用途。
因此 PyCharm 通过显示警告消息来尊重这一点,以便作者可以决定在导入包中的 * 时导入哪些模块。因此,这似乎是 PyCharm 的有用功能(我认为它决不能称为错误)。您可以通过在列表中的 __all__
变量中添加导入包时要导入的模块的名称来轻松删除此警告,如下所示
__init__.py
from . import MyModule1, MyModule2, MyModule3
__all__ = [MyModule1, MyModule2, MyModule3]
添加后,您可以ctrl+click
在项目的任何其他部分中使用的这些模块名称上直接跳转到声明,我经常觉得这非常有用。
我知道这是旧的,但谷歌把我送到这里,所以我猜其他人也会像我一样来。
2018 年的答案是这里选择的一个:Pycharm: "unresolved reference" error on the IDE when opening a working project
请注意,您只能添加一个 Content Root
,但您可以添加多个 Source Folders
。无需触摸 __init__.py
个文件。
您可以像这样将源目录标记为源根目录:
右键单击源目录
将目录标记为 --> 源根目录
文件 --> 使缓存无效/重新启动... -> 使缓存无效并重新启动
我从 cv2
文件夹中复制了 cv2.pyd
并将其粘贴到 site-packages
文件夹中,这解决了问题。
参考图片:
https://i.stack.imgur.com/cLEAT.png
https://i.stack.imgur.com/abNKb.png
好吧,我在这里真的超越了自己....我尝试导入的文件末尾没有 .py
扩展名
如果您在 PyCharm 中将多个单独的项目添加到一个项目并将另一个项目标记为源路由,也可能会出现此问题。
检查选择的源路由。它帮助我用 ctrl+click 解决了这个问题。
当在同一个窗口 2 中附加项目时,它在 PyCharm 中发生在我身上:
一个项目使用具有较新 Python 版本(例如 3.6)的 Python 解释器
另一个使用 Python 解释器和旧 Python 版本(例如 2.7)的项目
我不得不分离其中一个项目来解决指向错误 Python 版本的引用。
这发生在我的 websockets 库中,但似乎是一个更普遍的问题。示例:在“init.py init.py”中找不到引用“异常”
这对我有用:从 websockets 导入异常
确保您没有错误地更改了 __init__.py
文件的文件类型。例如,如果您将它们的类型更改为“文本”(而不是“Python”),PyCharm 将不会分析文件中的 Python 代码。在这种情况下,您可能会注意到 __init__.py
文件的文件图标与其他 Python 文件不同。
要解决此问题,请在 Settings > Editor > File Types
中,在“可识别的文件类型”列表中单击“文本”,然后在“文件名模式”列表中删除 __init__.py
。
不定期副业成功案例分享
__init__.py
文件以回溯到函数/变量所在的模块。因此,如果没有__all__
的模块名称,它就无法回溯到源。这是我的假设,我可能错了。__all__
不是强制性的并且 PyCharm 产生错误,那么是的,这是一个错误,因为这不是错误。 PyCharm 可以简单地发出警告。