gpt4 book ai didi

python - __init__ 类中的 TypeVar 类型提示

转载 作者:行者123 更新时间:2023-12-04 17:23:32 26 4
gpt4 key购买 nike

我正在尝试使用 TypeVar 将 init 参数指示为某种类型。
但我做错了,或者它甚至可能不可能。

from typing import TypeVar

T=TypeVar("T")

class TestClass:
def __init__(self,value:T):
self._value=value

a = TestClass(value=10)
b = TestClass(value="abc")

reveal_type(a._value)
reveal_type(b._value)
我希望 a._value 的显示类型本来是 intb._valuestring .
但它们都显示为“T`-1”
任何帮助或见解表示赞赏!
[编辑]
一个更扩展的例子。
BaseClass 将被覆盖,实际的类型提示由覆盖类提供。
from typing import TypeVar

T=TypeVar("T")

class BaseClass:
def __init__(self,value):
self._value = value

class Class1(BaseClass):
def __init__(self,value:str):
super().__init__(value)

class Class2(BaseClass):
def __init__(self,value:int):
super().__init__(value)

a = Class1("A value")
b = Class2(10)

reveal_type(a._value)
reveal_type(b._value)

最佳答案

默认情况下,使用 TypeVar 将其范围限制为仅用作注释的方法/函数。为了将 TypeVar 的范围限定为实例和所有方法/属性,请将类声明为 Generic .

from typing import TypeVar, Generic

T=TypeVar("T")

class BaseClass(Generic[T]): # Scope of `T` is the class:
def __init__(self, value: T): # Providing some `T` on `__init__`
self._value = value # defines the class' `T`
这允许将子类声明为泛型或具体。
class Class1(BaseClass[str]):      # "is a" BaseClass where `T = str`
pass # No need to repeat ``__init__``

class ClassT(BaseClass[T]): # "is a" BaseClass where `T = T'`
@property
def value(self) -> T:
return self._value

reveal_type(Class1("Hello World")._value) # Revealed type is 'builtins.str*'
reveal_type(Class1(b"Uh Oh!")._value) # error: Argument 1 to "Class1" has incompatible type "bytes"; expected "str"

reveal_type(ClassT(42).value) # Revealed type is 'builtins.int*'

关于python - __init__ 类中的 TypeVar 类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64873588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com