我在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,除了来源上方的那个都是空白文件。 我收到了很多类似的警告:
在__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
中找不到引用'choice'
我在谷歌上搜索这是什么意思,我该怎么做才能在Python中正确编码。
提前谢谢。
答案 0 :(得分:68)
这是pycharm中的一个错误。 PyCharm似乎期望引用的模块包含在__all__ = []
语句中。
对于正确的编码礼节,您是否应该包含模块中的__all__
声明? ..这实际上是我们听到年轻的Spock在接受测试时回答的问题,他回答说:“这在道德上是值得称赞的,但在道德上并不是强制性的。”
为了解决这个问题,您可以简单地全局禁用(极度非关键)(非常有用)检查,或者针对特定函数或语句禁用它。
这样做:
PyCharm有这样的小错误,但在我看来,它的好处远大于它的缺点。如果你想尝试另一个好的IDE,还有Spyder / Spyderlib。
在你提出问题之后,我知道这是相当多的,但我希望这有助于(你或其他人)。
编辑:最初,我认为这是检查__all__
特有的,但看起来它是更常见的'未解析参考'检查,这可能非常有用。最好使用该功能的语句级禁用,方法是使用上面提到的菜单,或者在语句前面的行上指定# noinspection PyUnresolvedReferences
。
答案 1 :(得分:15)
您应首先查看this。这解释了导入包时会发生什么。为方便起见:
import语句使用以下约定:如果包的
__init__.py
代码定义了名为__all__
的列表,则它将被视为from package import *
时应导入的模块名称列表遇到了。在发布新版本的软件包时,由软件包作者决定是否保持此列表的最新状态。如果包装作者没有看到从包装中导入*的用途,也可能决定不支持它。
因此,PyCharm通过显示警告消息来尊重这一点,以便作者可以在导入包时*决定导入哪些模块。因此,这似乎是PyCharm的有用功能(并且绝不会被称为bug,我猜)。您可以通过在__all__
变量列表中导入包时添加要导入的模块的名称来轻松删除此警告,如下所示
__初始化__。PY
from . import MyModule1, MyModule2, MyModule3
__all__ = [MyModule1, MyModule2, MyModule3]
添加之后,您可以ctrl+click
在项目的任何其他部分中使用的这些模块名称直接跳转到声明,我经常发现它非常有用。
答案 2 :(得分:5)
我知道这很老,但是google将我发送到了这里,所以我想其他人也会跟我一样。
2018年的答案是Pycharm: "unresolved reference" error on the IDE when opening a working project此处的选定答案
请注意,您只能添加一个Content Root
,但是可以添加多个Source Folders
。无需触摸初始化 .py文件
答案 3 :(得分:1)
您可以像这样将源目录标记为源根目录:
答案 4 :(得分:0)
您忘记在包中添加 init .py吗?
答案 5 :(得分:0)
确保您没有错误地更改了__init__.py
文件的文件类型。例如,如果您将其类型更改为“文本”(而不是“ Python”),则PyCharm将不会分析该文件的Python代码。在这种情况下,您可能会注意到__init__.py
文件的文件图标不同于其他Python文件。
要进行修复,请在Settings > Editor > File Types
的“已识别文件类型”列表中单击“文本”,然后在“文件名模式”列表中删除__init__.py
。
答案 6 :(得分:-3)