繁体   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