奇怪的 scikit-learn Python 智能感知错误消息

Gun*_*tan 4 python intellisense scikit-learn visual-studio-code pyright

最近,我正在使用 scikit-learn 包使用 Python 进行一些机器学习工作。\n我想使用 make_blobs() 函数,因此我开始编写代码,例如:

\n
X, y = make_blobs(n_samples=m, centers=2, n_features=2,  center_box=(80, 100))\n
Run Code Online (Sandbox Code Playgroud)\n

当然这很好。

\n

然而,在编写下一行代码时,我在 Visual Studio Code 中的 Intellisense(为了清楚起见,我只安装了适用于 Python 的 Microsoft 插件)开始在我之前提到的那一行上显示奇怪的错误。

\n

这是完整的错误消息:

\n
\n

类型为“tuple[Unknown | list[Unknown] | NDArray[float64], Unknown | list[Unknown] | NDArray[Any], ndarray[Any, dtype[float64]] | Any] | tuple[Unknown | list[Unknown] 的表达式] | NDArray[float64], Unknown | list[Unknown] | NDArray[Any]]" 无法分配给目标元组\n\xc2\xa0\xc2\xa0Type "tuple[Unknown | list[Unknown] | NDArray[float64] , Unknown | list[Unknown] | NDArray[Any], ndarray[Any, dtype[float64]] | Any]" 与目标元组不兼容\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 元素大小不合适; 预计 2 个,但收到 3 个

\n
\n

请注意最后一句。元素大小不匹配,其中 make_blobs() 函数返回 3 个元素。什么???\n我已经检查了 make_blobs() 函数的 scikit-learn 文档,并且我读到默认情况下 make_blobs() 仅返回 2 个元素而不是 3 个。\n当return_centers时可以返回 3 个元素设置为 True 时,可以返回 3 个元素,其中正如您在我的示例中看到的那样,我尚未将其设置为 true。

\n

好吧,也许我会尝试期待这 3 个元素,所以我修改了该行

\n
X, y, _ = make_blobs(n_samples=m, centers=2, n_features=2,  center_box=(80, 100))\n
Run Code Online (Sandbox Code Playgroud)\n

嗯...这是错误消息...

\n
\n

类型为“tuple[Unknown | list[Unknown] | NDArray[float64], Unknown | list[Unknown] | NDArray[Any], ndarray[Any, dtype[float64]] | Any] | tuple[Unknown | list[Unknown] 的表达式] | NDArray[float64], Unknown | list[Unknown] | NDArray[Any]]" 无法分配给目标元组\n\xc2\xa0\xc2\xa0Type "tuple[Unknown | list[Unknown] | NDArray[float64] , Unknown | list[Unknown] | NDArray[Any]]" 与目标元组不兼容\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0元素大小不匹配;预计 3 个,但收到 2 个

\n
\n

现在它返回 2 个元素?!

\n

我接下来尝试的是:

\n
    \n
  • 重新安装 scikit-learn 包。效果相同
  • \n
  • 清除 Python 及其所有文件。效果相同
  • \n
  • 重新安装 vscode 的 Microsoft python 扩展。效果相同
  • \n
\n

显然这是某种智能感知问题,因为运行代码工作正常,但是是什么原因导致了这种行为呢?

\n

我使用的Python是3.10.9和3.11.1。

\n

在 Windows 10 22H2 19045.2364 上运行。

\n

VSCode 是最新的。

\n

为了完整性,scikit-learn 版本是 1.2.0

\n

Ale*_*lex 6

这是 Pyright(Intellisense 中使用的 Python 类型检查器)的已知行为。如果函数中至少有一个 return 语句与您期望的不兼容,它会引发返回类型不匹配警告。请参阅其存储库中的类似问题以获取更多详细信息以及其中一位维护者的解释。

您可以使用注释禁止对此特定行的类型检查:

X, y = make_blobs(n_samples=m, centers=2, n_features=2,  center_box=(80, 100)) # pyright: ignore
Run Code Online (Sandbox Code Playgroud)

  • 您期望的类型是已知的:您期望有两个项目,而不是三个。这就是警告的内容。我在答案中添加了一种解决此特定问题的方法。 (2认同)