在Python的函数中是否有充分的理由接受float而不是int?

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

在一个大库中,我有一个“错误”,因为一个函数只接受 float 而不是 int

def foo(penalty: float):
    if not isinstance(penalty, float):
      raise ValueError(f"`penalty` has to be a float, but is {penalty}")
    # some instruction

我想创建一个包含以下内容的 PR :

def foo(penalty: int | float):
    if not isinstance(penalty, (int,float)):
      raise ValueError(f"`penalty` has to be a float or int, but is {penalty}")
    # some instruction

但在此之前,我问自己: 在 Python 中是否有充分的理由接受 float 而不是 int ?

python types casting
1个回答
0
投票

可能存在以下几个原因:

  • 浮点数具有整数所没有的方法。例如,

    fromhex
    hex
    方法存在于
    float
    对象上,但不存在于
    int
    对象上。如果函数使用此类方法,接受 int 将导致其失败。

  • 有时,在处理外部函数时,特别需要浮点数,例如,需要 C

    double
    的函数,
    float
    可以用于此目的,但
    int
    则不能。

  • isinstance
    int
    检查接受其他类型,例如
    bool
    对象,这可能是不合需要的。

  • 在Python2中,使用整数进行算术有时会产生与使用浮点数时不同的结果。如果该库向后兼容 Python2,那么它可能是这一事实的产物

大概,函数可以根据需要将整数向上转换为浮点数:

if isinstance(arg, int):
    arg = float(arg)

但是为了性能,最好出错并通知用户需要一个浮点数(所以也许用户可以开始使用浮点数)。

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