Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确使用Python泛型-如何获得泛型变量的类型并在初始化后在对象中一致地强制执行该类型?_Python_Python 3.x_Generics_Types_Python 3.8 - Fatal编程技术网

正确使用Python泛型-如何获得泛型变量的类型并在初始化后在对象中一致地强制执行该类型?

正确使用Python泛型-如何获得泛型变量的类型并在初始化后在对象中一致地强制执行该类型?,python,python-3.x,generics,types,python-3.8,Python,Python 3.x,Generics,Types,Python 3.8,假设一个包含值和名称的泛型类Test: T=TypeVar(“T”,str,int,float,bool) 类测试(通用[T]): 定义初始化(self,名称:str,值:T): self.\u name:str=name 自身价值:T=价值 自身类型:类型=T def设置(自身,新:T)->无: self.\u值=新 def get(自我)->T: 返回自我值 def get_类型(自身)->类型: 返回自。\ u类型 上面的操作并不是我想要的--您可以。将任何类型设置为新值,而不仅仅是创建

假设一个包含值和名称的泛型类
Test

T=TypeVar(“T”,str,int,float,bool)
类测试(通用[T]):
定义初始化(self,名称:str,值:T):
self.\u name:str=name
自身价值:T=价值
自身类型:类型=T
def设置(自身,新:T)->无:
self.\u值=新
def get(自我)->T:
返回自我值
def get_类型(自身)->类型:
返回自。\ u类型
上面的操作并不是我想要的--您可以
。将
任何类型设置为新值,而不仅仅是创建对象时的初始类型
t
。我也不知道如何提取类型
t
——如何在不调用
type(test\u object.get())
的情况下判断它是str、int、float还是bool

bool_var=Test(“Test”,True)
#以下任何一项都不是我所希望的那样:
布尔变量集(“str不是布尔”)
print(“如何使用泛型类型在上述行引发异常?”)
#我可以存储类型并将其作为Test.set函数的一部分进行比较,但是有没有办法
#利用泛型来实现这一点?
打印(类型(bool_var))
打印(bool\u变量get\u type())
打印(“创建对象时T的值在哪里?”)
#我如何以编程方式从这个混乱中提取bool,以至少看到创建对象时T是什么?

我希望做的事情是不是到目前为止Python还不支持?我是否以错误的方式处理泛型?

类型根本没有运行时强制,目前,它们对开发人员的提示比任何东西都多(或由autodoc工具使用)


但是,ide可能会警告您

除非您使用第三方工具,例如,像mypy这样的第三方静态类型检查器(它也不会有运行时效果,但您可以在运行代码之前使用它进行类型检查),否则类型批注不会产生运行时效果。第三方LIB强制执行运行时值包括。。。。pydantic?棉花糖?还有其他的吗?它们之间是否存在重大的哲学差异/成熟度差异?我将完全跳过运行时和执行,使用
mypy
x:bool = input("anything as a string:")