文字列が””(空文字)か、None(Null)の時

本来であれば、当サイトのstrを扱っているページで書いた方が良いのかも知れないが…

if文

いろんな局面で、文字列が空であるかNULLであるかの条件分岐が登場すると思う。ここで空とNULLと表現したが、Python的には以下の様な文字列になる。

data1 = "" # 空文字
data2 = None # NULL

システムを操作しているユーザーからみると、ほとんどの場合どちらも同じで“データが無い時”という扱いになることが多く、それをそのまま表現すると以下の様になる。

if data is None or data == "":
    print("データが無いとき")

しかしこれ、もっと単純にかけるので是非覚えておきたい。

empty_null.py
data = ""
if data:
    print("データがあるとき")
else:
    print("データが無いとき")

data = None
if data:
    print("データがあるとき")
else:
    print("データが無いとき")
MacBookPro:src $ python empty_null.py
データが無いとき
データが無いとき
MacBookPro:src $

つまりは、最初の例のデータが無いときという条件分岐を作りたければnotをつかって以下の様にすればよい。

if not data:
    print("データが無いとき")

まぁ、英語として見るには少し違和感はあるが、それでもif not dataと聞いたなら、データ無いときって言ってるんだろうなとは聞き取ると思うので、そう悪くない。

代入

ここまでは空文字かNULLかを判定するといった局面での話だったが、実はデータを格納するときにも同じように覚えておきたいことがある。

データを格納するときに、値があるならその値に、空やNULLだったら空に統一、またはNULLに統一という処理だ。

empty_null2.py
data = None
result = data or ""
print("result: >>>" + str(result) + "<<<")

data = ""
result = data or None
print("result: >>>" + str(result) + "<<<")

data = "value1"
result = data or None
print("result: >>>" + str(result) + "<<<")

result = data or ""
print("result: >>>" + str(result) + "<<<")

代入するときにorを使う方法だ。実行してみれば分かるが、以下の様になる。

MacBookPro:src $ python empty_null2.py
result: >>><<<
result: >>>None<<<
result: >>>value1<<<
result: >>>value1<<<
MacBookPro:src $

文字列がNULLつまりはPython的にはNoneとなっていることで嬉しいことがあるか考えてみたが、ちょっと思い浮かばない…

そもそもの話として、例えばデータベースでは、値があっても空文字でもNULLでもchar型である事に変わりは無い。だが、PythonはNULLの時だけはNoneが入っていて、それは文字列ではないのだ。そのままprintするならまだしも他の文字列と連結するのでさえ気を遣うのだ。空文字は空ではあるが、文字列である事で受ける恩恵があるたくさんあると思うので、是非とも活用したい。