如前所述,python 是鸭子类型的,因此您只需像往常一样做事,并期望用户处理引发的任何异常。
最好只对您的代码进行单元测试,确保所有内容都使用有效数字,这会增加您对某些工作的信心,并允许您更轻松地缩小可能的错误位置。
如果你真的想检查类型,你可以对对象的类型(例如isinstance(direction, int)
)使用断言来进行调试,但这实际上只是“穷人的单元测试”。
使用 python 的原则(请求宽恕,而不是许可,并且显式优于隐式),我会做这样的事情:
import math
def rotate_vector(vector, axis, direction):
try:
x, y, z = vector
except TypeError:
raise TypeError("Invalid vector {0}".format(vector))
valid_axes = {(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)}
if not axis in valid_axes:
raise ValueError("Invalid axis {0}".format(axis))
try:
ax, ay, az = axis
except TypeError:
raise TypeError("Invalid axis {0}".format(axis))
# do math to rotate the vector
# rotated = ...
try:
# You really only need the sign of the direction
return math.copysign(rotated, direction)
# or:
return rotated * math.copysign(1, direction)
except TypeError:
raise TypeError("Invalid direction {0}".format(direction))
因为你真的只关心方向的标志,你可以使用它并消除任何错误检查。的特殊情况0
将被视为1
,您可能需要提出一个ValueError
for 。
如果您实际上不需要 ax/ay/az 或 x/y/z,最好直接对vector
and执行操作axis
,并让底层操作引发异常。这将使它能够用于鸭子打字。
编辑:(更新axes
->axis
问题中的新值)