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

问题描述 投票:0回答:1

一方面,我了解到可以是

int
float
的数字应将类型注释为
float
(来源:PEP 484 类型提示这个 stackoverflow 问题):

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

另一方面,

int
不是
float
的实例:

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

因此,我希望

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

问题:

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

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

当参数被注释为具有类型

float
时,可接受类型
int
的参数;

因此,接受

int
(其中
float
已注释)显然是一种特殊情况,与注释通常处理类层次结构的方式无关。

还有其他类似的例子吗?

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

对于注释为类型

complex
的参数,
float
int
类型的参数是可接受的。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.