泛型类型转换

问题描述 投票:0回答:1

我正在使用 mypy 并遇到了意外的行为。 Mypy 错误地推断预期类型的类型

from typing import Generic, TypeVar, Callable, reveal_type

S1 = TypeVar('S1')
F1 = TypeVar('F1')
I = TypeVar('I')


class Node(Generic[I, S1, F1]):
    def __init__(self, callback: Callable[[I], S1 | F1]):
        self.callback: Callable[[I], S1 | F1] = callback


class Succ1:
    ...


class Fail1:
    ...


def func1(_: str) -> Succ1 | Fail1:
    return Succ1()


n1 = Node(func1)
res1 = n1.callback("str")
reveal_type(n1)
% mypy isolated_example2.py
isolated_example2.py:25: error: Need type annotation for "n1"  [var-annotated]
isolated_example2.py:25: error: Argument 1 to "Node" has incompatible type "Callable[[str], Succ1 | Fail1]"; expected "Callable[[str], Never]"  [arg-type]
isolated_example2.py:27: note: Revealed type is "isolated_example2.Node[builtins.str, Any, Any]"
Found 2 errors in 1 file (checked 1 source file)

我不期望输入 Callable[[str], Never] 类型,并且没有理由这么认为。可能是什么问题?

mypy==1.9.0
Python 3.12.3

这是一个更大问题的一部分,但我正在尝试将其分成单独的块,以便更好地理解流程

python generics type-inference mypy python-typing
1个回答
0
投票

必须阅读关于“类型推断和类型注释”的 de mypy 文档。我认为:

from typing import Generic, TypeVar, Callable, Union

S1 = TypeVar('S1')
F1 = TypeVar('F1')
I = TypeVar('I')


class Node(Generic[I, S1, F1]):
    def __init__(self, callback: Callable[[I], Union[S1, F1]]):
        self.callback: Callable[[I], Union[S1, F1]] = callback

在这一部分中,通过此注释,您对 mypy 说方法回调可以返回 S1 和 F1 之间的类型联合

© www.soinside.com 2019 - 2024. All rights reserved.