为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_遁去的一_1 2022-08-25 16:23:05
如果以前有人问过这个问题,请原谅我,但我找不到任何相关的答案。考虑一个将数值类型作为输入参数的函数: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 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

PEP 3141 为数字添加了抽象基类,因此您可以使用:


from numbers import Number


def foo(a: Number) -> Number:

    ...


查看完整回答
反对 回复 2022-08-25
?
繁星coding

TA贡献1797条经验 获得超4个赞

模块中没有泛型数值类型,因此您必须使用以下命令创建这样的类型:typingUnion


from typing import Union


numeric = Union[int, float, complex]


...

要添加对 Numpy 的数值类型集合的支持,请添加到该联合。np.number


numeric = Union[int, float, complex, np.number]


查看完整回答
反对 回复 2022-08-25
?
噜噜哒

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


查看完整回答
反对 回复 2022-08-25
  • 3 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信