Python は比較的初心者です。最近、データ型がブール値であることの検証に関して質問を投稿しました。[複数の属性に記述子 (編集: 単一のデコレータではない) を使用しますか?
与えられた答えは、アヒルのタイピングを参照しました。簡単な例があり、理解していることを確認したいと思います。私のコードが次の場合:
class Foo4(object):
def __init__(self):
self.bool1=True
def send_rocket(self, bool_value):
if not bool_value:
print "Send rocket ship to sun first... bad move."
print "Send rocket ship to Mars... good move."
f=Foo4()
f.send_rocket(f.bool1)
#Send rocket ship to Mars... good move.
f.bool1=None
f.send_rocket(f.bool1)
#Send rocket ship to sun first... bad move.
#Send rocket ship to Mars... good move.
ダックタイピングをある程度正しく理解している場合、上記のクラスでは、bool1 が常にブール値であると信じています。bool1 == False または bool1 == True かどうかを確認する必要はありません。誰かが私のモジュールを間違って使用した場合、つまり bool1 = None の場合、メソッドは、問題があったことを示さずに実行したくないことを実行し、ロケット船の人々が死亡します。
bool1 が常に真のブール値であることを保証するコードを書くことができた別の方法は次のとおりです (上記のリンクの BooleanDescriptor のクレジット!):
class BooleanDescriptor(object):
def __init__(self, attr):
self.attr = attr
def __get__(self, instance, owner):
return getattr(instance, self.attr)
def __set__(self, instance, value):
if value in (True, False):
return setattr(instance, self.attr, value)
else:
raise TypeError
class Foo4(object):
def __init__(self):
self._bool1=True
bool1 = BooleanDescriptor('_bool1')
def send_rocket(self, bool_value):
if not bool_value:
print "Send rocket ship to sun... bad move."
print "Send rocket ship to Mars... good move."
f=Foo4()
f.send_rocket(f.bool1)
#Send rocket ship to Mars... good move.
f.bool1=None
#TypeError.
#Never gets here: f.send_rocket(f.bool1)
最初の方法 (チェックしない) が正しい方法だと理解していますか? つまり、最初の例で次のように明示的にコードを書くこともできたはずです。
if bool_value ==True:
print "do something"
elif bool_value == False:
print "do something else"
else:
print "invalid boolean value"
しかし、bool1 を使用するすべてのメソッドなどでこれを行う場合、そもそも bool1 が真のブール値であることを検証しないのはなぜですか (DRY!)!?!? :-)
ありがとう!
ポール