为什么类型提示“ float”甚至不是子类都接受“ int”?

时间:2020-07-04 05:54:53

标签: python unions typing

一方面,我了解到可以将intfloat的数字键入为float(来源:PEP 484 Type Hints和{{3} }):

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

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

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

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

问题:

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

1 个答案:

答案 0 :(得分:4)

| * int / float是类型注释中的特殊情况吗?

float是一种特殊情况。 int不是。 PEP 484在您的问题中的链接所引用的以下段落中说:

当一个参数的注释类型为float时,可接受的类型为int的参数;

因此,接受带有int注释的float显然是一种特殊情况,与注释通常处理类层次结构的方式无关。

|还有这样的例子吗?

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

对于注释为complex类型的参数,可接受类型floatint的参数。

| *如果这是非预期用途,是否会有任何棉绒警告我Union[float, int]

Union[float, int]很好。

float批注的特殊处理只是一种便利(PEP 484称之为“快捷方式”)使人们避免写出冗长的Union[float, int]批注,因为可以成为floatint很常见。