在一个大库中,我遇到了一个"错误",因为一个函数只接受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

我想用以下内容开设公关:

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?

推荐答案

可能存在一些原因:

  • 浮点数具有integer不具有的方法.例如,fromhexhex方法存在于float个对象上,但不是int个对象上.如果函数使用此类方法,接受int将导致其失败.

  • 有时,在处理外来函数时特别需要浮点数,例如,函数期望C doublefloat适用于此目的,但int不适用.

  • 其他类型通过对intisinstance次判断来接受,例如bool个对象,这可能是不希望的.

  • 在Python 2中,使用integer的算术有时会产生与使用浮点数不同的结果.如果该库向后兼容Python 2,那么它可能是该事实的产物

  • 函数可能显式期望只能表示为浮点数的值.例如,如果一个函数期望一个介于(不含)0和1之间的值,那么int永远没有意义.

据推测,函数可以根据需要将整数上转换为浮点数:

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

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

Python相关问答推荐

有没有方法可以修复删除了换码字符的无效的SON记录?

如何终止带有队列的Python进程?+ 队列大小的错误?

在使用Guouti包的Python中运行MPP模型时内存不足

Python会扔掉未使用的表情吗?

Django管理面板显示字段最大长度而不是字段名称

将特定列信息移动到当前行下的新行

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

仿制药的类型铸造

根据在同一数据框中的查找向数据框添加值

使用miniconda创建环境的问题

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

用合并列替换现有列并重命名

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

有没有一种方法可以从python的pussompy比较结果中提取文本?

Stacked bar chart from billrame

UNIQUE约束失败:customuser. username

将scipy. sparse矩阵直接保存为常规txt文件

导入错误:无法导入名称';操作';

提高算法效率的策略?