Python如何对Number的子类类型(而非数值实例)实现类型标注?
解决方案
你要实现的类型标注完全可以通过Type的泛型写法实现,无需额外运行时检查,静态类型检查器(如mypy、pyright)可直接完成校验。
核心写法
你需要的标注是Type[Number],语义为「所有Number抽象基类的子类的类对象」,恰好覆盖int、float、numpy数值dtype等场景。
Python 3.8及更早版本
from numbers import Number from typing import Type def foo(bar: Type[Number]): print(bar)
Python 3.9及更高版本
Python 3.9支持PEP 585内置泛型,可以直接用小写的type代替导入的Type,写法更简洁:
from numbers import Number def foo(bar: type[Number]): print(bar)
效果验证
以下调用都会被静态检查器判定为合法:
foo(int) foo(float) import numpy as np foo(np.uint8)
如果传入非数值类型(如foo(str)),静态检查器会直接抛出类型错误,无需在代码中添加assert运行时校验。
补充说明
你之前寻找的NumberType实际不需要单独定义,Type[Number]就是对应需求的标准标注方式,numbers.Number作为抽象基类已经涵盖了所有符合数值协议的类型,包括Python内置类型和第三方库(如numpy)的数值类型。
内容的提问来源于stack exchange,提问作者s-m-e
相关产品推荐
相关产品推荐

