为什么类型提示 `float` 接受 `int` 而它甚至不是子类?
Why does a type hint `float` accept `int` while it is not even a subclass?
一方面,我了解到可以是 int
或 float
的数字应该被类型注释为 float
(来源:PEP 484 Type Hints and ):
def add(a: float, b: float):
return a + b
另一方面,int
不是 float
的实例:
issubclass(int, float)
returns False
isinstance(42, float)
returns False
因此我希望 Union[int, float]
是这个用例的正确注释。
问题:
- 这种违反直觉的行为的原因是什么?类型提示是否遵循与 class 比较不同的机制(例如在某些情况下是“无损转换”规则)?
int
/float
是类型注释的特例吗?还有其他类似的例子吗?
- 如果这是非预期用途,是否有任何 linter 会警告我
Union[float, int]
?
- 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]
注释,因为参数float
或 int
很常见。
一方面,我了解到可以是 int
或 float
的数字应该被类型注释为 float
(来源:PEP 484 Type Hints and
def add(a: float, b: float):
return a + b
另一方面,int
不是 float
的实例:
issubclass(int, float)
returnsFalse
isinstance(42, float)
returnsFalse
因此我希望 Union[int, float]
是这个用例的正确注释。
问题:
- 这种违反直觉的行为的原因是什么?类型提示是否遵循与 class 比较不同的机制(例如在某些情况下是“无损转换”规则)?
int
/float
是类型注释的特例吗?还有其他类似的例子吗?- 如果这是非预期用途,是否有任何 linter 会警告我
Union[float, int]
?
- 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 typeint
is acceptable;
因此接受 int
其中 float
被注释显然是一种特殊情况,独立于注释通常处理 class 层次结构的方式。
Are there other examples like this?
是的,至少还有一种特殊情况。在同一段中,PEP 484 继续说:
for an argument annotated as having type
complex
, arguments of typefloat
orint
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]
注释,因为参数float
或 int
很常见。