簡體   English   中英

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

[英]Cannot find reference 'xxx' in __init__.py

我在 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

你應該先看看這個 這解釋了導入包時會發生什么。 為了方便:

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:打開工作項目時IDE上的“未解析的引用”錯誤

請注意,您只能添加一個Content Root但您可以添加多個Source Folders 無需接觸__init__.py文件。

您可以將源目錄標記為源根目錄,如下所示:

  • 右鍵單擊源目錄
  • 將目錄標記為 --> 源根
  • 文件 --> 使緩存無效/重新啟動... -> 使緩存無效並重新啟動

圖 1圖 2

我從 cv2 文件夾復制了 cv2.pyd 並將其粘貼到 site-packages 文件夾中,這解決了問題。

好吧,我真的在這里超越了自己......我試圖導入的文件末尾沒有.py擴展名

如果您將幾個單獨的項目添加到 PyCharm 中的一個項目並將不同的項目標記為源路由,也可能會出現此問題。

檢查選擇的源路由。 它幫助我用 ctrl+click 解決了這個問題。

它發生在我的 PyCharm 中,在同一個 window 2 個附加項目中:

  • 一個項目使用 Python 解釋器和更新的 Python 版本(例如 3.6)
  • 另一個項目使用 Python 解釋器和舊 Python 版本(例如 2.7)

我不得不分離其中一個項目來解決指向錯誤 Python 版本的引用。

這發生在我的 websockets 庫中,但似乎是一個更普遍的問題。 示例:在“ init .py init .py”中找不到引用“異常”

這對我有用:從 websockets 導入異常

確保您沒有錯誤地更改__init__.py文件的文件類型。 例如,如果您將它們的類型更改為“文本”(而不是“Python”),PyCharm 將不會分析文件中的 Python 代碼。 在這種情況下,您可能會注意到__init__.py文件的文件圖標與其他 Python 文件不同。

要修復,請在Settings > Editor > File Types ,在“Recognized File Types”列表中單擊“Text”並在“File name patterns”列表中刪除__init__.py

你忘記在你的包中添加init .py 了嗎?

我在我的 pycharm 中以稍微不同的方式解決了這個問題。

轉到設置 -> 項目解釋器,然后單擊那里的基本包。

你會看到這樣的頁面

問題指南

之后,當你的包被安裝時,你應該看到包是藍色而不是白色。

未解決的參考也消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM