Mypy 在类型上分支时错误地报告联合类型变量的错误

Mypy falsely reports error on union-typed variable when branching on type

我 运行 在使用 mypy 时遇到了一个问题,并且能够找到任何关于它的 help/reports 。以下简化代码和错误消息应该是不言自明的:

#!/usr/bin/env python3

from typing import List, Union

class Corpus:
  path: List[str]

  def __init__(self, path:Union[str,List[str]]) -> None:
    if type(path) == str:
      self.path = [path]
    else:
      self.path = path

Mypy 报错如下:

simplified.py:10: error: List item 0 has incompatible type "Union[str, List[str]]"; expected "str"
simplified.py:12: error: Incompatible types in assignment (expression has type "Union[str, List[str]]", variable has type "List[str]")

即使检查了路径变量的类型,以便 self.path 应该始终生成字符串列表,mypy 仍会抱怨类型不兼容。

我是不是忽略了什么或者这是 mypy 中的错误? (这是一个错误,我应该使用 #type: ignore 注释还是有更好的解决方法?)

(一些背景:我决定通过编写一个模块来减轻我的生活,它会处理一些重复的工作。有问题的参数应该是文本数据的路径,我希望它只是一个字符串时间,所以我不想强制将它放入列表中。但是,我也希望允许指定更多路径。在内部,无论如何我将它存储为列表,因为 class 上的迭代器总是用这样的初始化列表(然后可能通过 "unpacking" 个目录进一步扩展)。

尝试使用 isinstance(path, str) 而不是 type(path) == str。前者使 mypy 对您的代码进行类型检查而不报告错误。

Mypy 确实应该支持后一种形式——关于它有一个 open feature request。尚未实施的原因几乎可以肯定是由于时间不够——mypy 的核心团队非常小,而且在这种情况下有一个简单的解决方法,因此该功能被取消了优先级。

(但是嘿,mypy 是开源的,所以如果你有空闲时间...)