猿问

如何在Python中键入提示通用数字类型?

如果以前有人问过这个问题,请原谅我,但我找不到任何相关的答案。


考虑一个将数值类型作为输入参数的函数:


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;


qq_遁去的一_1
浏览 165回答 3
3回答

呼啦一阵风

PEP 3141 为数字添加了抽象基类,因此您可以使用:from numbers import Numberdef foo(a: Number) -> Number:    ...

繁星coding

模块中没有泛型数值类型,因此您必须使用以下命令创建这样的类型:typingUnionfrom typing import Unionnumeric = Union[int, float, complex]...要添加对 Numpy 的数值类型集合的支持,请添加到该联合。np.numbernumeric = Union[int, float, complex, np.number]

噜噜哒

当前接受的使用解决方案是相当破碎的,因为正如注释中指出的那样,对于像mypy和PyRight这样的静态类型检查器来说,s不是s。这种情况已经讨论了多年,但没有明确的解决方案。NumberintNumber从相关问题的详细解释中提取的另一种可能方法是:from typing import SupportsFloat as Numeric它具有以下行为:from decimal import Decimalfrom fractions import Fractionfrom typing import SupportsFloat as Numericimport numpy as npdef 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")这样做的优点是相当宽松的,除了 。如果您也想包含,只需执行complexcomplexfrom typing import SupportsFloat, UnionNumeric = Union[SupportsFloat, complex]或者等效于 Python ≥3.10 样式:from typing import SupportsFloat, TypeAliasNumeric: TypeAlias = SupportsFloat | complex也许不幸的是,NumPy数组在某种意义上被认为是数字,但这说明了“什么是数字?”这个问题的晦涩的哲学本质。SupportsFloat
随时随地看视频慕课网APP

相关分类

Python
我要回答