我怎么能告诉 mypy 一个条件是有保证的?

How can I tell mypy that a condition is guaranteed?

我的实际情况比较复杂,但是MVCE是

from typing import List


def find_largest(numbers: List[int]) -> List[int]:
    """
    >>> find_largest([3, 4, 5, 5, 3, 1, -2, 4, 3, 3])
    [5, 5]
    """
    assert len(numbers) > 0  # guaranteed by caller
    largest_numbers = None
    value = None
    for number in numbers:
        if value is None or number > value:
            largest_numbers = [number]
            value = number
        elif number == value:
            largest_numbers.append(number)
    return largest_numbers


if __name__ == '__main__':
    import doctest
    doctest.testmod()

当我在上面 运行 mypy 时,我得到:

mytest.py:18: error: Incompatible return value type (got "Optional[List[int]]", expected "List[int]")
Found 1 error in 1 file (checked 1 source file)

但 mypy 未捕获的限制保证不会返回 None。我如何向 mypy 暗示这一点? (不可能用其他东西初始化)

您的代码仍然可以 return None 根据 Mypy 并且它认为输入是正确的。

假设您无法解决此问题,您还可以强制 return 始终具有以下值:

assert largest_numbers
return largest_numbers

或者,使用 typing.cast:

To the type checker this signals that the return value has the designated type, but at runtime we intentionally don’t check anything (we want this to be as fast as possible).

from typing import List, cast
...

def find_largest(numbers: List[int]) -> List[int]:
    """
    >>> find_largest([3, 4, 5, 5, 3, 1, -2, 4, 3, 3])
    [5, 5]
    """
    assert len(numbers) > 0  # guaranteed by caller
    largest_numbers = None
    value = None
    for number in numbers:
        if value is None or number > value:
            largest_numbers = [number]
            value = number
        elif number == value:
            largest_numbers.append(number)
    return cast(List[int], largest_numbers)
...