-1

PEP 532から次のステートメントに出くわしました:

  • __else__if末尾のelse句がないため、式の短絡的な結果です
  • __then__else先頭のif句がないため、式の短絡的な結果です

それらの声明は何を意味していますか?ポイントをもう少し明確にする例はありますか?

4

1 に答える 1

3

あなたは (について) PEP 532 - A circuit breaking operator and protocol を読んでいるようです。左側のオペランドにショートサーキット操作へのアクセスを与える提案です。

orPython は現在、 andandブール演算子にフックする方法がありません。これらの演算子は、左側のオペランドから結果を決定できる場合、右側のオペランド式を評価する必要がないという点で短絡的です。

たとえば、次の式は例外を発生させません。

count = 0
average = count and total / count

右側の式をZeroDivisionError実行すると例外が発生しますが。

PEP は新しい演算子 operator を提案elseします。この演算子は、左側のクラスがtrue-valueに基づいて操作の結果を処理できるようにします。だから表現では

lefthand else righthand

lefthand クラスには、の値に応じてlefthandまたはへのアクセスが与えられます。righthandbool(lefthand)

見つけたステートメントの完全なコンテキストを提供しませんでしたが、PEP 532 は__else__and__then__メソッドを定義する提案です。type(lefthand).__then__(lefthand)lefthandtrue と見なされた場合に呼び出され、そうでない場合type(lefthand).__else__(righthand)は次のように呼び出されます。

result = type(lefthand).__then__(lefthand) if lefthand else type(lefthand).__else__(lefthand, righthand)

これらを次のように実装できます

class CircuitBreaker:
    def __bool__(self):
        # am I true or false?
        return someboolean

    def __then__(self):
        # I'm true, so return something here
        return self

    def __else__(self, righthand):
        # I'm false, the righthand has been evaluated and pass ed in
        return righthand

PEP 532 はまだ議論中であり、この提案が実装されない可能性があることに注意してください。

于 2016-12-06T22:18:23.750 に答える