Python 类uuu init_uuuu类型暗示中的TypeVar

Python 类uuu init_uuuu类型暗示中的TypeVar,python,python-typing,Python,Python Typing,我试图使用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._v

我试图使用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.\u值
的显示类型应该是
int
b.\u值
应该是
string
。 但它们都显示为“T`-1”

感谢您的帮助和见解

[编辑]

一个稍微扩展的例子。 基类将被重写,实际类型提示由重写类提供

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

输入import TypeVar,Generic
T=类型变量(“T”)
类基类(泛型[T]):#'T'的作用域是类:
def uu init(self,value:T):#在u init上提供一些'T'__`
self._value=value#定义类''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*'

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

输入import TypeVar,Generic
T=类型变量(“T”)
类基类(泛型[T]):#'T'的作用域是类:
def uu init(self,value:T):#在u init上提供一些'T'__`
self._value=value#定义类''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*'

你写代码的时候是什么意思?您希望类型变量做什么?这不是使用类型变量的方式。您希望
TestClass
是泛型的还是其他什么?我基本上希望_value属性采用我分配给它的值的类型。但事实并非如此。您必须将
TestClass
定义为泛型,即
classtestclass(generic[t]):
。否则,
T
的conrcete类型仅限于该方法,并在之后丢失。您编写该代码时的意思是什么?您希望类型变量做什么?这不是使用类型变量的方式。您希望
TestClass
是泛型的还是其他什么?我基本上希望_value属性采用我分配给它的值的类型。但事实并非如此。您必须将
TestClass
定义为泛型,即
classtestclass(generic[t]):
。否则,
T
的conrcete类型只适用于该方法,之后将丢失。非常感谢!非常感谢你!