文字列がNoneの場合はブランクにする

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 "

このように書くことにより、変数が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にする、といったことも可能です。