2017-11-13 4 views
0

私はPythonでVector3クラスを実装しようとしています。 Vector3クラスをC++やC#で記述すると、X、Y、Zのメンバーは浮動小数点数で保存されますが、Pythonではducktypingという方法があります。だから私のC++/C#の知識に従って、私はこのような何かを書いた:Pythonがisinstance()Vectorをアサートする

class Vector3: 
    def __init__(self, x=0.0, y=0.0, z=0.0): 
     assert (isinstance(x, float) or isinstance(x, int)) and (isinstance(y, float) or isinstance(y, int)) and \ 
       (isinstance(z, float) or isinstance(z, int)) 
     self.x = float(x) 
     self.y = float(y) 
     self.z = float(z) 

質問がアサート文についてです:あなたは、このインスタンス(数学用のVector3実装)でそれらを使用するかではないでしょう。

def __add__(self, other): 
    assert isinstance(other, Vector3) 
    return Vector3(self.x + other.x, self.y + other.y, self.z + other.z) 

これらのインスタンスでassertを使用しますかしないかを指定しますか? このウェブサイトによると:https://wiki.python.org/moin/UsingAssertionsEffectivelyそれは過度に使用されるべきではありませんが、静的な型指定を使っている人として私にとっては、同じデータ型をチェックするのは非常に奇妙です。

答えて

2

assertは、実動コードでのデバッグに使用するよりも、デバッグに適しています。 isinstanceはまた種類のタプルをとる方法

class Vector3: 
    def __init__(self, x=0.0, y=0.0, z=0.0): 
     self.x = x 
     self.y = y 
     self.z = z 

    @property 
    def x(self): 
     return self._x 

    @setter.x 
    def x(self, val): 
     if not isinstance(val, (int, float)): 
      raise ValueError('Inappropriate type: {} for x whereas a float \ 
      or int is expected'.format(type(val))) 
     self._x = float(val) 

    ... 

お知らせ:渡された値が必要なタイプでないときは、代わりにベクトルがxyz属性のプロパティを作成し、raise ValueErrorことができます。 __add__オペレータで

、あなたはraise TypeError代わりに、また、適切なメッセージを含むでしょう:

def __add__(self, other): 
    if not isinstance(other, Vector3): 
     raise TypeError('Object of type Vector3 expected, \ 
     however type {} was passed'.format(type(other))) 
    ... 
+0

だから、また、その一例で)(でisinstanceを使用すると、ちょうどすぐに右の種類を期待していませんか? –

+0

@StefanBユーザーは、複合型などの他の数値型を渡すことを防ぐことができます。 –

関連する問題