繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM