使用mypy时遇到问题,并且能够找到有关它的任何帮助/报告。以下简化的代码和错误消息应该是不言自明的:

#!/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注释还是有更好的解决方法?)

(某些背景:我决定编写一个模块来减轻重复工作,该模块将负责一些重复的工作。有争议的论点应该是文本数据的路径,并且我希望大多数情况下它只能是一个字符串,所以我不不想强行将其放置在列表中。但是,我也希望允许指定更多路径。在内部,无论如何,我都将其存储为列表,因为类的迭代器始终使用此类列表进行初始化(然后可能通过以下方式进一步扩展它: “解压缩”目录))。

最佳答案

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

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

(但是,mypy是开源的,因此,如果您有空余时间...)

关于python-3.x - Mypy在类型上分支时错误地报告联合类型变量的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51656300/

10-12 22:37