1

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!)!?!? :-)

ありがとう!

ポール

4

2 に答える 2

2

通常の Python スタイルが最初のアプローチです。

たとえば、最後の瞬間まで太陽に行くか火星に行くかを決めることができない何かで、あなたのライブラリを使用したいと思うかもしれません。したがって、このクラスのインスタンスを渡す場合があります。

class LastMinuteDecision(object):

    def __bool__(self):
        return make_decision_now()

あなたがそこにいくつかのテストを入れていて、私があなたのライブラリを呼び出す方法を私よりよく知っていると思っていたら、私はそれをすることができませんでした.パイソンで...

[編集: 明確でない場合、 __bool__ メソッドはインスタンスをブール値のように「見える」ようにします。言語がブール値を期待するときに呼び出されます。]

ばかげていると思うかもしれませんが、驚くほどうまく機能します。

于 2009-11-10T17:24:18.977 に答える
0

動的に型付けされた値を、本質的に静的に型付けされるように強制するクラスでラップすることは、方法ではないと思います。

私は専門家ではありませんが、あなたの最終的な方法が最良の方法であると期待しています (つまり、true、false、またはそれ以外をチェックしてください)。

于 2009-11-10T16:44:11.413 に答える