Python 打字:如何使用泛型?

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

考虑以下示例:

import typing

T = typing.TypeVar('T', bound=typing.Union[int, bool, str])

class Test(typing.Generic[T]):

    def __init__(self, v: T) -> None:
        self.v = v
        self.t = type(v)

    def parse(self, s: str) -> T:
        if self.t == int:
            return int(s, base=0)
        elif self.t == bool:
            return s.lower() != 'false'
        elif self.t == str:
            return s
        else:
            raise NotImplementedError()

mypy 抱怨:

test.py:13: error: Incompatible return value type (got "int", expected "T")
test.py:15: error: Incompatible return value type (got "bool", expected "T")
test.py:17: error: Incompatible return value type (got "str", expected "T")

如何重写代码,以便 mypy 理解 T 在本例中是 int/bool/str?

python mypy python-typing
1个回答
0
投票
import typing

T = typing.TypeVar('T', int, bool, str)

class Test(typing.Generic[T]):
    def __init__(self, v: T) -> None:
        self.v: T = v  # Annotation.
        self.t: typing.Type[T] = type(v)  # Annotation.

def parse(self, s: str) -> T:
    if self.t == int:
        return typing.cast(T, int(s, base=0))
    elif self.t == bool:
        return typing.cast(T, s.lower() != 'false')
    elif self.t == str:
        return typing.cast(T, s)
    else:
        raise NotImplementedError()

init 方法中为变量 v 和 t 键入注释:

init方法中,为变量v和t添加了类型注释,以明确指示它们的类型。这样 MyPy 就能正确推断类型并检测键入错误。

在解析方法中使用typing.cast:

在parse方法中,您使用writing.cast函数将返回类型执行特定的转换为T。这表明您知道返回类型与T兼容。

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