Type[type]是否为类对象的正确类型提示?自定义AnyType是否合规?
你的
AnyType定义并不符合目标需求,咱们来拆解一下 首先明确你的核心目标:让AnyType只接受类对象(比如str、YourCustomClass这种本身是类的对象),拒绝类的实例、函数、基本数据类型等非type类型的对象。
为什么AnyType = Type[type]不对?
在Python的类型系统里,Type[T]表示的是「能生成T实例的类,或者T的子类的类」。当你写Type[type]时,它实际指代的是元类——也就是type的子类(比如自定义元类class MyMeta(type): ...)。而咱们平时定义的普通类(比如你的ChildRegistryMixin)都是type的实例,并非type的子类,所以普通类根本不符合Type[type]的类型要求,这就和你的目标完全相反了。
正确的写法是什么?
如果要实现「接受任意类对象」的需求,有两种等价的正确写法:
写法1:使用Type[Any]
from typing import Type, Any AnyType = Type[Any]
Type[Any]表示任意类的类型,所有类对象(不管是内置类还是自定义类)都符合这个类型注解。
写法2:直接使用type
AnyType = type
因为在Python中,所有类本身都是type的实例,所以type类型的变量天然可以接收任何类对象,同时会拒绝类的实例、函数、数值等非类对象。
验证一下效果
用mypy这类类型检查器测试的话:
- 合法场景(不会报错):
valid1: AnyType = str valid2: AnyType = int valid3: AnyType = ChildRegistryMixin - 非法场景(会触发类型错误):
invalid1: AnyType = ChildRegistryMixin() # 类的实例,不是类对象 invalid2: AnyType = lambda x: x # 函数类型 invalid3: AnyType = 123 # 基本数据类型
另外提一句,你定义的MixinSubclsType = Type["ChildRegistryMixin"]是完全正确的,它表示ChildRegistryMixin类本身或者它的子类,符合你的混入类场景需求。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

