请原谅,这个问题以前有人问过,但我找不到任何相关的答案。
考虑一个将数值类型作为输入参数的函数:
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;
3条答案
按热度按时间yeotifhr1#
PEP 3141为数字添加了抽象基类,因此您可以用途:
uhry853o2#
在
typing
模块中没有泛型数值类型,所以你必须用Union
创建这样一个类型:要添加对Numpy的数字类型集合的支持,请将
np.number
添加到该Union。kb5ga3dv3#
目前公认的使用
Number
的解决方案是相当不合理的,正如评论中指出的,对于静态类型检查器(如mypy和PyRight),int
不是Number
。从detailed explanation from a related question中提取的另一种可能的方法是:
其具有以下行为:
这样做的好处是相当宽松,除了
complex
。如果您还想包括complex
,只需这样做或等同于Python ≥3.10风格:
NumPy数组在
SupportsFloat
的意义上被认为是数字,这也许是不幸的,但这说明了“什么是数字"这个问题的晦涩的哲学本质。主要缺点:
正如@lkwbr所指出的,
SupportsFloat
类型实际上只适合于识别数字,它不支持加法或比较之类的运算符。例如,Pyright给出以下错误:
类型“SupportsFloat”和“SupportsFloat”不支持运算符“〈”