为什么在使用Pandas的concat函数后,Visual Studio Code说我的代码不可达?

13 投票
4 回答
2455 浏览
提问于 2025-04-14 16:14

Koda Ulaşılamıyor -> Code is unreachable

Koda Ulaşılamıyor -> Code is unreachable

在使用 pd.concat() 之后,我发现Visual Studio代码把我的代码变成灰色,并且提示说这些代码是不可达的。虽然这个编辑器运行得还不错,但我觉得很烦人,我希望我的代码能恢复成五颜六色的样子。

我该怎么做才能让编辑器不把我的代码变灰,而不需要改变当前的编程语言呢?

4 个回答

2

以下方法对我有效:

sorted_excel_files:list[pd.DataFrame] = [sorted_excel_file_1, sorted_excel_file_2]
sorted_excel_file = pd.concat(excel_files)
2

原因是因为在 pandas-stubs 中有一个重载的方法签名,它规定如果给一个 Iterable[None],就一定会抛出异常。实际上,它只接受 Iterable[Series]Iterable[DataFrame]。VSCode 的静态分析并不会检查这个是否正确,所以它错误地认为有无法到达的代码。

关于谁应该负责让这个正常工作,大家有一些争论(可以查看这个 GitHub 问题),但我想提供一个简单的解决方案,不需要对存根进行复杂的修改,而且应该总是有效。

如果你给输入添加类型提示,让 VSCode 确认输入会是接受的类型之一,那么它就不会认为程序会崩溃。

在你的情况下,问题在于 sort_values 说它会返回 Any。所以,你可以通过给前面的变量添加类型提示来解决这个问题:

sorted_excel_file_1: pd.DataFrame = df.iloc[:82].sort_values(by='H-arm', ascending=True)
sorted_excel_file_2: pd.DataFrame = df.iloc[82:].sort_values(by='H-arm', ascending=True)
14

这是一个目前在 pandas-stubs 中存在的bug。

在pandas-stubs中,concat的匹配重载现在返回的是Never

根据Pylance GitHub上的这个建议,你可以通过在 ...\.vscode\extensions\ms-python.vscode-pylance-2024.3.1\dist\bundled\stubs\pandas\core\reshape\concat.pyi 文件中注释掉这个Never重载来解决pandas-stubs的问题。

@overload
def concat(
    objs: Iterable[None] | Mapping[HashableT1, None],
    *,
    axis: Axis = ...,
    join: Literal["inner", "outer"] = ...,
    ignore_index: bool = ...,
    keys: Iterable[HashableT2] = ...,
    levels: Sequence[list[HashableT3] | tuple[HashableT3, ...]] = ...,
    names: list[HashableT4] = ...,
    verify_integrity: bool = ...,
    sort: bool = ...,
    copy: bool = ...,
) -> Never: ...

撰写回答