Fra*_*Boi 23 python types type-hinting python-3.x
如果之前有人问过这个问题,但我找不到任何相关的答案,请原谅我。
考虑一个将数字类型作为输入参数的函数:
def foo(a):
return ((a+1)*2)**4;
Run Code Online (Sandbox Code Playgroud)
这适用于整数、浮点数和复数。
是否有基本类型,以便我可以进行类型提示(真实现有类型/基类),例如:
def foo(a: numeric):
return ((a+1)*2)**4;
Run Code Online (Sandbox Code Playgroud)
此外,我需要在集合类型参数中使用它,例如:
from typing import Collection;
def foo(_in: Collection[numeric]):
return ((_in[0]+_in[1])*2)**4;
Run Code Online (Sandbox Code Playgroud)
jua*_*aga 29
PEP 3141添加了数字的抽象基类,因此您可以使用:
from numbers import Number
def foo(a: Number) -> Number:
...
Run Code Online (Sandbox Code Playgroud)
blh*_*ing 10
typing模块中没有通用数字类型,因此您必须使用以下方法创建这样的类型Union:
from typing import Union
numeric = Union[int, float, complex]
...
Run Code Online (Sandbox Code Playgroud)
要添加对 Numpy 的数字类型集合的支持,请添加np.number到该 Union 中。
numeric = Union[int, float, complex, np.number]
Run Code Online (Sandbox Code Playgroud)
当前接受的 using 解决方案Number相当糟糕,因为正如评论中指出的那样,ints 不适Number用于 mypy 和 PyRight 等静态类型检查器。这种情况已经讨论了多年,但没有明确的解决方案。
从相关问题的详细解释中提取的另一种可能的方法是:
\nfrom typing import SupportsFloat as Numeric\nRun Code Online (Sandbox Code Playgroud)\n其具有以下行为:
\nfrom decimal import Decimal\nfrom fractions import Fraction\nfrom typing import SupportsFloat as Numeric\n\nimport numpy as np\n\n\ndef f(x: Numeric) -> None:\n pass\n\n\n# Accepted by mypy/Pyright:\nf(123)\nf(np.uintc(55))\nf(Fraction(-3, 2))\nf(Decimal("-3.14"))\nf(np.array([1, 2, 3])) # Should an array be numeric?\n\n# Results in type errors:\nf(complex(2, 3))\nf("asdf")\nRun Code Online (Sandbox Code Playgroud)\n这样做的优点是相当宽松,但complex. 如果您complex也想包括在内,只需执行以下操作即可
from typing import SupportsFloat, Union\n\nNumeric = Union[SupportsFloat, complex]\nRun Code Online (Sandbox Code Playgroud)\n或等效于 Python \xe2\x89\xa53.10 风格:
\nfrom typing import SupportsFloat, TypeAlias\n\nNumeric: TypeAlias = SupportsFloat | complex\nRun Code Online (Sandbox Code Playgroud)\n也许不幸的是,NumPy 数组在 的意义上被认为是数字SupportsFloat,但这说明了“什么是数字?”这个问题的晦涩的哲学本质。
正如@lkwbr 所指出的,该SupportsFloat类型仅真正适合识别数字。它不支持任何运算符,例如加法或比较。
例如,Pyright 给出以下错误:
\n\n\n类型“SupportsFloat”和“SupportsFloat”不支持运算符“<”
\n
| 归档时间: |
|
| 查看次数: |
6678 次 |
| 最近记录: |