在一个大库中,我有一个“错误”,因为一个函数只接受 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 ?
可能存在以下几个原因:
浮点数具有整数所没有的方法。例如,
fromhex
或hex
方法存在于float
对象上,但不存在于int
对象上。如果函数使用此类方法,接受 int 将导致其失败。
有时,在处理外部函数时,特别需要浮点数,例如,需要 C
double
的函数,float
可以用于此目的,但 int
则不能。
isinstance
的int
检查接受其他类型,例如bool
对象,这可能是不合需要的。
在Python2中,使用整数进行算术有时会产生与使用浮点数时不同的结果。如果该库向后兼容 Python2,那么它可能是这一事实的产物
大概,函数可以根据需要将整数向上转换为浮点数:
if isinstance(arg, int):
arg = float(arg)
但是为了性能,最好出错并通知用户需要一个浮点数(所以也许用户可以开始使用浮点数)。