为什么类型提示 `float` 接受 `int` 而它甚至不是子类?

Why does a type hint `float` accept `int` while it is not even a subclass?

一方面,我了解到可以是 intfloat 的数字应该被类型注释为 float(来源:PEP 484 Type Hints and ):

def add(a: float, b: float):
    return a + b

另一方面,int 不是 float 的实例:

因此我希望 Union[int, float] 是这个用例的正确注释。

问题:

  • Are int/float a special case in type annotations?

float 是一个特例。 int 不是。 PEP 484 说,在您问题中 link 引用的下面的段落中:

when an argument is annotated as having type float, an argument of type int is acceptable;

因此接受 int 其中 float 被注释显然是一种特殊情况,独立于注释通常处理 class 层次结构的方式。

Are there other examples like this?

是的,至少还有一种特殊情况。在同一段中,PEP 484 继续说:

for an argument annotated as having type complex, arguments of type float or int are acceptable.

  • Is there any linter that would warn me about Union[float, int] if this is an unintended use?

Union[float, int] 完全没问题。

float 注释的特殊处理只是一种方便(PEP 484 称之为“捷径”),让人们避免写出冗长的 Union[float, int] 注释,因为参数floatint 很常见。