4.6.1. and−or トリックの使い方

Example 4.17. and−or トリックの導入

>>> a = "first"

>>> b = "second"

>>> 1 and a or b

'first'

>>> 0 and a or b

'second'

この命令は、C言語の bool ? a : b 式に似ている。式の全体は、左から右へと評価されるため、and がはじめに評価される。 1  and  'first' の評価結果は 'first' である。そして、'first' or 'second' の評価結果は 'first' となる。

0 and 'first' False である。そして、0 or 'second' の評価結果は 'second' である。

  しかしながら、Python の式は、単純なブール論理であり、言語に依存する特殊な構成となっていないため、Python and-or  トリックと C言語の bool ? a : b 式との間には、ひとつ、きわめて重要な違いが存在する。もしも、a の値が偽だった場合、この式は、読者が意図したようには動かないであろう

Example 4.18. and−or トリックが、失敗する例

>>> a = ""

>>> b = "second"

>>> 1 and a or b

'second'

a は、Python が偽とみなす空の文字列なので、1 and ' ' は ' ' と評価される。そして、' ' or 'second' は、 'second' と評価される。おおっと、これはあなたが望んだものではない!

  and-or  トリックの背後にある真のトリックは、a の値が絶対に偽にならないことにある。これを実現するための一つの一般的な方法は、a [a] に、b [b] に変更し、返されたリストの第一要素、すなわち、a または b を用いることである。

Example 4.19. and−or トリックを安全に使う

>>> a = ""

>>> b = "second"

>>> (1 and [a] or [b])[0]


[a] は空ではないリストであり、偽にはなりえない。もしも、a 0 または ' ' のような他の偽となるような値であったとしても、リスト [a] 自体は真である。なぜなら、[a] はひとつの要素をもっているからである

  今のところ、このトリックはその価値よりも面倒ごとの方が多そうに見えるかもしれない。後ほど、読者は if 文を使って同様のことが実現できることを学ぶ。ではなぜ、この事例のような混乱を経験しなくてはならないのだろう? 多くのケースにおいては、あなたは二つの定数値のどちらかを選ぶことになるので、シンプルな命令を使うことができ、心配する必要はない。なぜなら、a の値はいつでも真だと、あなたが知っているであろうからである。そして、もしも、あなたが、より複雑な「安全な形式」(safe form) を使わなければならない場合においてさえも、そうするに足る十分良い理由がある。たとえば、Python では、lambda 関数のように if 文がゆるされていないケースがある。

and-or トリックに関する、さらなる読み物: