Noneの文字列表現
変数の値を文字列として出力する際、取り扱いに注意したいのがNoneの場合です。
Pyhontでは変数がNoneの場合、文字列表現はブランクではなく'None'という文字列となります。
s = None text = str(s) print(text) # 'None'
Noneの場合、ブランクにしたい場合があると思いますが、いちいち
if s is None: s = ""
と書くのもなかなか面倒くさいものです。
or演算子の活用
or演算子の性質
そこでよく使われるイディオムを紹介します。
or演算子には、単純に論理演算するだけではなく、演算子の左側がFalseの場合、右側の値を返す性質があります。
https://docs.python.jp/3/reference/expressions.html#boolean-operations
式 x or y は、まず x を評価します; x が真なら x の値を返します; それ以外の場合には、 y の値を評価し、その結果を返します。
NoneはFalseで評価されますので、(参考:if文)この性質を利用すると、以下のように書くと、変数がNoneの場合、ブランクを設定することが可能です。
このように書くことにより、変数がNoneの場合はor演算子右側のブランクが採用されます。実際に試してみましょう。
s = None text = s or "" print(text) # ブランク s = "hoge" text = s or "" print(text) # hoge
変数がNoneの時だけブランクに変換されることが確認できました。
逆もできる
また、ブランク自身も論理演算上ではFalseと評価されるため、これをを利用すると逆、つまりブランクの場合はNoneにする、ということも可能です。
s = "" text = s or None print(text) # 'None' s = "hoge" text = s or None print(text) # hoge
リストにも
このテクニックはけっこう応用が効きます。
リストかNoneが入っている変数に対してfor文を記述した場合、その変数がNoneの場合だと以下のコードはエラーとなります。
for val in values: # 何らかの処理 # TypeError: 'NoneType' object is not iterable
こちらもor演算子で対処することが可能です。
for val in (values or []): pass
もちろん同様に整数型を想定した変数でNoneの場合は0にする、といったことも可能です。