PyType无法识别int/float作为numbers.Number返回类型的解决方案
解决PyType对numbers.Number返回类型的检查错误
解决方案
方案1:明确返回类型为Union[int, float]
函数实际只会返回int或float类型,直接将返回类型标注为Union[int, float],PyType就能正确识别:
from numbers import Number from typing import Union import math def to_number(value: Union[str, Number]) -> Union[int, float]: if isinstance(value, Number) and math.isnan(value): raise ValueError(f"No NaNsense") try: return int(value) except ValueError: try: return float(value) except ValueError as exc: raise ValueError(f"'{value}' is not a number") from exc
方案2:使用TypeVar绑定numbers.Number
通过typing.TypeVar创建一个绑定到numbers.Number的类型变量,让PyType认可int和float作为其合法子类:
from numbers import Number from typing import Union, TypeVar import math Num = TypeVar('Num', bound=Number) def to_number(value: Union[str, Number]) -> Num: if isinstance(value, Number) and math.isnan(value): raise ValueError(f"No NaNsense") try: return int(value) except ValueError: try: return float(value) except ValueError as exc: raise ValueError(f"'{value}' is not a number") from exc
问题原因
Python运行时中,int和float确实是numbers.Number抽象基类的实例(通过isinstance验证),但你使用的PyType 2022.12.15版本的静态类型检查逻辑未将这两种类型与numbers.Number建立子类关联,导致静态检查时认为返回类型不匹配。
内容的提问来源于stack exchange,提问作者Syafiq Kamarul Azman
相关产品推荐
相关产品推荐

