3 回答

TA貢獻1802條經驗 獲得超6個贊
PEP 3141 為數字添加了抽象基類,因此您可以使用:
from numbers import Number
def foo(a: Number) -> Number:
...

TA貢獻1797條經驗 獲得超4個贊
模塊中沒有泛型數值類型,因此您必須使用以下命令創建這樣的類型:typingUnion
from typing import Union
numeric = Union[int, float, complex]
...
要添加對 Numpy 的數值類型集合的支持,請添加到該聯合。np.number
numeric = Union[int, float, complex, np.number]

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
添加回答
舉報