2

假设您有一个功能:

def divide(a, b):
    return a / b

如果aand bare float, int, 或它们的组合,这显然会给出不同的结果。如果您只关心何时ab是浮动的情况,那么处理这个问题的最佳方法是什么?

一世)

def divide(a, b):
    if not isinstance(a, float):
        raise TypeError('a must be a float')
    if not isinstance(b, float):
        raise TypeError('b must be a float')
    return a / b

ii)

def divide(a, b):
    return float(a) / float(b)

iii) 别的东西?

我的偏好是 ii),但一位同事认为,如果您在其他地方使用ab那么 i) 更有可能防止错误。

这显然是一个微不足道的例子,但我的同事有更多的经验,C我正在努力解释为什么 usingisinstance并不真正适合鸭式打字,并且让它渗透到我们的 python 代码中并不是很好。

4

4 回答 4

3

另一种选择可能是

def divide(a, b):
    return a * 1.0 / b

或者

from __future__ import division

def divide(a, b):
    return a / b
于 2013-09-11T09:48:24.093 回答
1

如果您想做真正的除法,无论 Python 版本如何,并且不想使用未来的导入,那么另一种选择是:

from operator import truediv
print truediv(4, 2)
# 2.0

无论其输入如何(给定一个整数/浮点数),它总是会进行真正的除法并返回一个浮点数......传递分数/复数/小数将有其他输出!

于 2013-09-11T09:54:19.630 回答
0

我假设这divide()只是一个函数的示例,它可能会在给定具有意外类型的参数的情况下默默地产生错误结果。

为了避免对函数中的类型检查进行硬编码,可以使用泛型函数,例如,get_items()函数允许统一处理 json 对象和 json 数组(比较convert_decimal()实现:带有isinstance()调用的实现与带有泛型的get_items()实现)。

如果仅根据第一个参数的类型进行调度是不够的;参见Guido van Rossum的 Python 中的五分钟多方法。

于 2014-03-01T13:47:42.480 回答
0

为什么不使用:

def divide(a, b):
    return float(a) / float(b)

可能一次转换为浮点数也足够了。

于 2013-09-11T09:51:18.000 回答