【问题标题】:Recognise list comprehension type识别列表理解类型
【发布时间】:2022-01-23 03:20:36
【问题描述】:

获取以下代码:

from typing import Union

value: Union[str, bytes]
stripped = [line.strip() for line in value.splitlines()]

reveal_type(stripped)

对于任何阅读的人来说,很明显stripped 应该是类型

Union[List[str], List[bytes]]

但是,mypy 将其识别为

List[Union[str, bytes]]

如何让mypy 将其识别为Union[List[str], List[bytes]]

【问题讨论】:

  • 我没有看到这个问题。您有一个联合类型列表,而不是列表类型的联合
  • 如果valuestr,那么stripped 将是str 的列表。如果valuebytes,那么stripped 将是bytes 的列表。没有其他可能,不是吗?
  • 列表是一个列表。时期。因此,这就是stripped 的类型。每个元素要么是str要么是bytes
  • 是的,但我知道要么所有元素都是str,要么所有元素都是bytes。有没有办法告诉mypy这个?
  • 我想你可以尝试强制它stripped: Union[List[str], List[bytes]] = [...]

标签: python mypy


【解决方案1】:

你可以试试这个:

from typing import Union

value: Union[str, bytes]
stripped_str =[]

if isinstance(value, str):
    stripped_str = [line.strip() for line in value.splitlines()]
else:
    stripped_bytes = [line.strip() for line in value.splitlines()]

stripped = stripped_str or stripped_bytes

reveal_type(stripped)

这样Mypy发现stripped的类型是Union[list[str], list[bytes]]

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多