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

mat*_*urg 6 python type-hinting unions

一方面,我了解到可以intfloat应该被类型注释的数字float(来源:PEP 484 类型提示这个 stackoverflow 问题):

def add(a: float, b: float):
    return a + b
Run Code Online (Sandbox Code Playgroud)

另一方面, anint不是 的实例float

  • issubclass(int, float) 返回 False
  • isinstance(42, float) 返回 False

因此,我希望Union[int, float]成为此用例的正确注释。

问题:

  • 这种违反直觉的行为的原因是什么?类型提示是否遵循与类比较不同的机制(例如,在某些情况下是“无损转换”规则左右)?
  • int/float型注释的特例?还有其他类似的例子吗?
  • 是否有任何 linter 会警告我Union[float, int]这是否是意外使用?

ott*_*ter 5

  • int/float 是类型注释中的特例吗?

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

当参数被注释为具有 type 时float,类型的参数int是可以接受的;

所以接受intwherefloat被注解是一种特殊的情况,与注解通常处理类层次结构的方式无关。

还有其他类似的例子吗?

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

对于注释为具有类型的complex参数,类型float或类型的参数int是可接受的。

  • 是否有任何 linter 会警告我Union[float, int]这是否是意外使用?

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

float注释的特殊处理只是一种方便(PEP 484 称其为“快捷方式”),让人们避免写出冗长的Union[float, int]注释,因为可以是 afloat或 anint的参数非常常见。