[英]How to type hint a generic numeric type in Python?
如果之前有人问过这个问题,但我找不到任何相关的答案,请原谅我。
考虑一个将数值类型作为输入参数的 function:
def foo(a):
return ((a+1)*2)**4;
这适用于整数、浮点数和复数。
是否有基本类型,以便我可以进行类型提示(真实存在的类型/基类),例如:
def foo(a: numeric):
return ((a+1)*2)**4;
此外,我需要在集合类型参数中使用它,例如:
from typing import Collection;
def foo(_in: Collection[numeric]):
return ((_in[0]+_in[1])*2)**4;
PEP 3141添加了数字的抽象基类,因此您可以使用:
from numbers import Number
def foo(a: Number) -> Number:
...
typing
模块中没有通用数字类型,因此您必须使用Union
创建这样的类型:
from typing import Union
numeric = Union[int, float, complex]
...
要添加对 Numpy 的数字类型集合的支持,请将np.number
添加到该联合。
numeric = Union[int, float, complex, np.number]
考虑到,正如评论中所指出的那样,当前接受的使用Number
的解决方案相当不完善,对于 mypy 和 PyRight 等 static 类型检查器, int
不是Number
。 这种情况已经讨论了多年,没有明确的解决办法。
从相关问题的详细解释中提取的另一种可能的方法是:
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")
除了complex
之外,这具有相当宽松的优点。 如果您还想包含complex
的,只需执行
from typing import SupportsFloat, Union
Numeric = Union[SupportsFloat, complex]
或等效于 Python ≥3.10 样式:
from typing import SupportsFloat, TypeAlias
Numeric: TypeAlias = SupportsFloat | complex
不幸的是 NumPy arrays 在SupportsFloat
的意义上被认为是数字,但这说明了“什么是数字?”这个问题的晦涩哲学性质。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.