3 回答
TA贡献1802条经验 获得超6个赞
PEP 3141 为数字添加了抽象基类,因此您可以使用:
from numbers import Number
def foo(a: Number) -> Number:
...
TA贡献1797条经验 获得超4个赞
模块中没有泛型数值类型,因此您必须使用以下命令创建这样的类型:typingUnion
from typing import Union
numeric = Union[int, float, complex]
...
要添加对 Numpy 的数值类型集合的支持,请添加到该联合。np.number
numeric = Union[int, float, complex, np.number]
TA贡献1784条经验 获得超7个赞
当前接受的使用解决方案是相当破碎的,因为正如注释中指出的那样,对于像mypy和PyRight这样的静态类型检查器来说,s不是s。这种情况已经讨论了多年,但没有明确的解决方案。NumberintNumber
从相关问题的详细解释中提取的另一种可能方法是:
from typing import SupportsFloat as Numeric
它具有以下行为:
from decimal import Decimal
from fractions import Fraction
from typing import SupportsFloat as Numeric
import numpy as np
def f(x: Numeric) -> None:
pass
# Accepted by mypy/Pyright:
f(123)
f(np.uintc(55))
f(Fraction(-3, 2))
f(Decimal("-3.14"))
f(np.array([1, 2, 3])) # Should an array be numeric?
# Results in type errors:
f(complex(2, 3))
f("asdf")
这样做的优点是相当宽松的,除了 。如果您也想包含,只需执行complexcomplex
from typing import SupportsFloat, Union
Numeric = Union[SupportsFloat, complex]
或者等效于 Python ≥3.10 样式:
from typing import SupportsFloat, TypeAlias
Numeric: TypeAlias = SupportsFloat | complex
也许不幸的是,NumPy数组在某种意义上被认为是数字,但这说明了“什么是数字?”这个问题的晦涩的哲学本质。SupportsFloat
添加回答
举报