假设你有一个功能:
def divide(a, b):
return a / b
如果a
和b
为float
,int
或其组合,则显然会产生不同的结果。如果您只关心a
和b
是浮动的情况,那么处理此问题的最佳方法是什么?
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),但是一位同事辩称,如果你在其他地方使用a
和b
,那么i)更有可能防止错误。
这显然是一个微不足道的例子,但我的同事对C
有更多的经验,我正在努力解释为什么使用isinstance
并不真正适合鸭子打字和拥有它透过我们的python代码并不是很好。
答案 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。