Pythonic是浮子和整体的实例

时间:2013-09-11 09:46:14

标签: python duck-typing

假设你有一个功能:

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

如果abfloatint或其组合,则显然会产生不同的结果。如果您只关心ab是浮动的情况,那么处理此问题的最佳方法是什么?

i)个

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

ⅱ)

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

iii)别的什么?

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

这显然是一个微不足道的例子,但我的同事对C有更多的经验,我正在努力解释为什么使用isinstance并不真正适合鸭子打字和拥有它透过我们的python代码并不是很好。

4 个答案:

答案 0 :(得分:3)

另一种选择可能是

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

from __future__ import division

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

答案 1 :(得分:1)

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

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

总是会进行真正的除法并返回一个浮点数而不管它的输入(给定一个int / float)...传递分数/复数/小数将有其他输出!

答案 2 :(得分:0)

为什么不使用:

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

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

答案 3 :(得分:0)

我假设divide()只是一个函数的示例,如果给出具有意外类型的参数,它可能静默产生错误的结果。

为了避免对函数中的类型检查进行硬编码,可以使用泛型函数,例如,get_items() function允许统一处理json对象和json数组(比较convert_decimal()实现:the one with isinstance() calls vs. another with the generic get_items() )。

如果仅根据第一个参数的类型进行调度是不够的;见Guido van van Rossum的Five-minute Multimethods in Python