【问题标题】:mypy cannot infer type of generator comprehension correctlymypy 无法正确推断生成器理解的类型
【发布时间】:2021-01-19 03:41:36
【问题描述】:

我正在使用 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]]". 如果我改用pd.concat([test() for _ in range(10)]),mypy 会再次高兴。有人可以向我解释那里发生了什么吗?

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

【问题讨论】:

    标签: python pandas types mypy


    【解决方案1】:

    您将生成器与序列混淆了。一个序列是,by definition

    一个支持通过__getitem__() 特殊方法使用整数索引进行有效元素访问并定义返回序列长度的__len__() 方法的迭代。

    生成器都不支持,而且它也不是一种映射,所以你不能将一个传递给pd.concat

    【讨论】:

      【解决方案2】:

      首先,由于我的代码中的生成器表达式的 SendType 和 ReturnType 均为 None,因此 Generator[DataFrame, None, None] 是正确的类型,请参阅 docs。正如 chepner 所指出的,问题在于预期的类型。尽管 pandas.concat 除外 generators data-science-types 没有它作为可能的输入类型。我会认为这是一个错误,但他们在github page data-science-types 上写了

      哲学:[...] 库中的实际 API 通常比存根中的类型签名更宽松;但这(通常)是一个特性,而不是一个错误。

      我认为问题已解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 2022-11-15
        • 2021-06-22
        相关资源
        最近更新 更多