在__init__.py中找不到引用“ xxx”-Python / Pycharm


74

我在皮查姆有一个组织如下的项目:

-- 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中找不到引用“选择”

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

先感谢您。


警告来自什么?一个IDE?Python本身不会发出这样的警告。
Daniel Roseman 2014年

是什么给您该警告?据我所知,这不是Python错误消息。您使用的是IDE还是某种样式检查工具?
kindall 2014年

是的对不起 我正在使用Pycharm。
pceccon 2014年

1
需要说明的是,在我的情况下,仅在MacOS 10.13.3,PyCharm Professional 2017.3.3上重新启动PyCharm即可解决此警告消息。

我刚刚在用ip安装了numpy时才发现这种情况。如果我直接通过Pycharm单独安装,则没有问题。
joshmcode

Answers:


94

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

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

为了解决这个问题,您可以简单地全局禁用该检查(非常不重要)(非常有用),或者针对特定的函数或语句取消检查。

为此:

  • 将插入符号放在错误的文本上(“选择”,来自上面的示例)
  • 调出意图菜单(默认情况下,按alt输入,将mine设置为alt-backspace)
  • 点击向右箭头以打开子菜单,然后选择相关操作

PyCharm有很多类似的小错误,但是我认为它的好处远大于缺点。如果您想尝试另一个好的IDE,也可以使用Spyder / Spyderlib。

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

编辑: 最初,我认为这是特定于check的__all__,但是看起来它是更通用的“ Unresolved References”检查,这可能非常有用。最好是使用语句级的功能禁用功能,方法是使用上述菜单,或者# noinspection PyUnresolvedReferences在语句前的一行中指定。


26

你应该先看看这个。这说明了导入软件包时会发生什么。为了方便:

import语句使用以下约定:如果程序包的__init__.py代码定义了名为的列表__all__,则将其视为from package import *遇到时应导入的模块名称的列表。发行新版本的软件包时,软件包作者有责任使此列表保持最新。如果软件包作者没有看到从软件包中导入*的用途,他们可能还会决定不支持它。

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

__init__.py

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

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


3
我同意警告不是错误,但您无法按Ctrl键并单击该模块的事实可以得到解决
user110954

@ user110954也许PyCharm会查看__init__.py文件以追溯到函数/变量所在的模块。因此,没有__all__模块名称,就无法追溯到源。这是我的假设,我可能错了。
Sнаđошƒаӽ


8

您可以将源目录标记为源根,如下所示:

  • 右键单击源目录
  • 将目录标记为->源根
  • 文件->使高速缓存无效/重新启动...->使无效并重新启动

0

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

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



-7

我已经以不同的方式解决了我的pycharm中的这个问题。

转到设置->项目解释器,然后单击那里的基本包。

您会看到这样的页面

问题指导

之后,安装软件包后,您应该会看到软件包是蓝色而不是白色。

未解决的参考文献也消失了。


5
这与已安装的软件包相关的参考无关。在回答之前请仔细阅读问题
Bg1850
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.