2005-04-04

WyPy を読む - ブール演算

11行の Python スクリプトで実装された Wiki「WyPy」を読んでみました。えげつない。Python コードとは思えないくらい、implicit に動作しています。インデントが無いし。



まず、困ったのが↓これです。




print '...'+(s and', '.join([f(n)for n in d if s[0]in o(n)]) or '')+'...'


知っている人は知っている (トートロジー) のでしょうけれど、私はちゃんと分かっていませんでした。というわけで、マニュアルを調べました。5.10 Boolean operations のところに、ちゃんと載っています。以下、意訳。




  • Python の論理演算は None, 数値の0、空のシーケンスを偽として扱います。その他の値は真。

  • 式「x and y」は、最初に x を評価する。x が偽なら、x の評価値が返される。そうでなければ、y が評価され、y の評価値が返される。

  • 式「x or y」は、最初に x を評価する。x が真なら x の評価値が返される。そうでなければ、y が評価され、y の評価値が返される。

  • 最後に評価された値が返される。True / False に強引に置き換えたりしない。



ふむふむ。「最後に評価された値が返される」っていうのがポイントですね。ちょっと試してみましょう。




>>> "Spam" and "Ham"
'Ham'
>>> "Spam" or "Ham"
'Spam'
>>> "" and "Spam"
''
>>> "" or "Spam"
'Spam'


あー、なるほど。では、最初のコードに戻りましょう。




print (s and', '.join([f(n)for n in d if s[0]in o(n)]) or '')


というコードは、以下のように書き換えることができるわけです。




if s:
result = ', '.join([f(n) for n in d if s[0]in o(n)])
if result:
print result
else:
print ''
else:
print s


変数 s には、常に文字列が入っているとすると、s が偽になるのは '' のときです。また、この処理は HTML のコンテンツを書き出している部分なので、「print ''」というのは、事実上、何もしないのと同じです。というわけで、




if s:
', '.join([f(n) for n in d if s[0]in o(n)])


と書き換えることができます。ふーむ。