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)])
と書き換えることができます。ふーむ。