前に述べたように、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
。
ax/ay/az または x/y/z が実際に必要ない場合は、 and に対して直接操作を実行し、基になる操作で例外を発生させる方がよい場合がvector
ありaxis
ます。これにより、ダックタイピングが可能になります。
編集:(更新axes
->axis
質問の新しい値について)