簡體   English   中英

mypy 無法正確推斷生成器理解的類型

[英]mypy cannot infer type of generator comprehension correctly

我正在使用data-science-types提供的存根文件讓 mypy 能夠檢查我的 Pandas 相關代碼。 可悲的是,我得到以下行為:

為了

import pandas as pd

def test() -> pd.DataFrame:
    pass

pd.concat((test() for _ in range(10)))

mypy 報告test.py:6: error: Argument 1 to "concat" has incompatible type "Generator[DataFrame, None, None]"; expected "Union[Sequence[DataFrame], Mapping[str, DataFrame]]". test.py:6: error: Argument 1 to "concat" has incompatible type "Generator[DataFrame, None, None]"; expected "Union[Sequence[DataFrame], Mapping[str, DataFrame]]". 如果我使用pd.concat([test() for _ in range(10)])而不是 mypy 又高興了。 有人可以向我解釋那里發生了什么嗎?

以防萬一。 我正在使用 python3.8.5、pandas 1.1.2、mypy 0.782 和 data-science-types 0.2.18。

您將生成器與序列混淆了。 根據定義,序列是

通過__getitem__()特殊方法支持使用整數索引進行有效元素訪問的可迭代對象,並定義了返回序列長度的__len__()方法。

生成器既不支持,也不是一種映射,因此您不能將一個傳遞給pd.concat

首先,因為我的代碼中的生成器表達式的 SendType 和 ReturnType 為 None 所以Generator[DataFrame, None, None]是正確的類型,請參閱 文檔 所以正如chepner指出的那樣,問題在於預期的類型。 盡管pandas.concat除了生成器data-science-types沒有將其作為可能的輸入類型。 我會認為這是一個錯誤,但在他們的github 頁面data-science-types 上他們寫了

理念:[...] 庫中的實際 API 通常比我們的存根中的類型簽名更寬松; 但這(通常)是一個功能而不是一個錯誤。

我認為問題已解決。

暫無
暫無

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

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