如何为函数添加限制性子类类型提示:仅接受Foo子类并返回对应实例
如何为函数添加类型提示,限制仅接受Foo子类类型并返回对应子类实例
你的核心需求是让函数只接受Foo的子类类型作为参数,并且返回该子类的实例——同时要确保如果函数逻辑错误返回了其他Foo子类的实例,类型检查器能触发错误。你最初的泛型写法方向是对的,但需要确保类型检查器运行在严格模式下,才能检测到返回固定子类实例的问题。
正确的类型注解写法
from typing import TypeVar, Type class Foo: pass class Bar(Foo): pass class Baz(Foo): pass class Spam: pass # 定义绑定到Foo的泛型类型变量 T = TypeVar("T", bound=Foo) def func(t: Type[T]) -> T: return t() # 返回传入类型的实例,符合类型约束
这个写法能满足你的所有基础需求:
func(Spam)会触发类型检查错误,因为Spam不是Foo的子类y: Baz = func(Bar)会报错,因为func(Bar)返回的是Bar实例,无法赋值给Baz类型的变量
检测错误的返回逻辑
当你写出错误的函数逻辑,比如固定返回Baz()时:
def func(t: Type[T]) -> T: return Baz() # 这里应该触发类型检查错误
要让类型检查器识别这个错误,需要开启严格模式:
- 如果你用mypy:运行时加上
--strict参数,或者在mypy.ini中设置strict = True - 如果你用pyright:默认的严格模式就会检测到这个问题,因为
Baz实例无法匹配泛型参数T(T是传入的任意Foo子类,不一定是Baz)
为什么之前没触发错误?
很多类型检查器默认不会启用最严格的校验规则,比如mypy默认允许泛型返回值和实际类型存在一定的兼容性(因为Baz是Foo的子类,符合bound=Foo的约束),但开启严格模式后,会强制校验返回值必须和泛型参数T完全匹配,而不是仅仅符合上界约束。
内容的提问来源于stack exchange,提问作者SpaghettiChef
相关产品推荐
相关产品推荐

