【问题标题】:Why does a type hint `float` accept `int` while it is not even a subclass?为什么类型提示`float`接受`int`,而它甚至不是子类?
【发布时间】:2021-08-05 21:46:15
【问题描述】:

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

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 unions type-hinting


    【解决方案1】:
    • int/float 是类型注释中的特例吗?

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

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

    因此,在 float 被注解的地方接受 int 是一种明确的特殊情况,与注解通常处理类层次结构的方式无关。

    还有其他类似的例子吗?

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

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

    • 如果这是非预期用途,是否有任何 linter 会警告我有关 Union[float, int] 的信息?

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

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

    【讨论】:

    • 是的,python 类型注释确实做出了务实的妥协。另一个例子是在应该是NoneType 或其他东西时用None 进行注释
    • 谢谢!所以我的谬误在于假设float 应该优先于Union[int, float]。我使用更明确的Union[int, float] 完全没问题 - 对吧? :)
    猜你喜欢
    • 2021-11-28
    • 2021-08-11
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多