Pythonでは値がないことはNoneオブジェクトで表現される。ある変数の値がNoneかどうかを調べる方法やその際の注意点を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
a = None
if a is None: # PEP 8で推奨されている
print('a is None')
else:
print('a is not None')
if a == None: # PEP 8で推奨されていない
print('a == None')
else:
print('a != None')
if not a is None: # PEP 8では可読性の観点から推奨されていない
print('a is not None')
else:
print('a is None')
def foo(x=None):
if x: # 「if x is not None」のつもり
print(x)
else:
print('not assigned')
foo() # not assigned
foo('bar') # bar
def foo(x=None):
if x is not None: # デフォルト引数値が上書きされたかどうかをチェック
print('assigned')
else:
print('not assigned')
foo('') # assigned
foo() # not assigned
Pythonでは「値がない」ことを明示するのにNoneオブジェクトを使用する。NoneはNoneTypeクラスの唯一のインスタンスとなっている(シングルトン)。
Pythonコードの様式のガイダンスとして有名なPEP 8では、ある変数の値がNoneであるかどうかを調べるときには、等価性を比較する「==」や「!=」ではなく、「is」か「is not」を使用することが強く推奨されている。これはNoneはシングルトンであるために、ある値がNoneであるかどうかを調べるには同一性の比較を行うだけで十分だからである。
a = None
if a is None: # PEP 8で推奨されている
print('a is None')
else:
print('a is not None')
if a == None: # PEP 8で推奨されていない
print('a == None')
else:
print('a != None')
値がNoneでないことを確認したいときには次のような書き方もできる(notの位置が異なっている点に注意)。
if not a is None: # PEP 8では可読性の観点から推奨されていない
print('a is not None')
else:
print('a is None')
これは可読性の観点から推奨されておらず、「if a is not None」のような書き方をすることが推奨されている。
真偽値の評価の観点からはNoneはFalseと見なされる。
if None:
print(True)
else:
print(False) # こちらが実行される
だが、ある変数の値がNoneでないことを前提とした次のようなコードを書くことは推奨されていない。
def foo(x=None):
if x: # 「if x is not None」のつもり
print(x)
else:
print('not assigned')
foo() # not assigned
foo('bar') # bar
これは空文字列など、真偽値判定の場面ではFalseと見なされる値があるからだ。例えば上記のfoo関数に空文字列を渡しても「」と表示される。
foo('') # not assigned
上のようにデフォルト引数値をNoneとして、関数呼び出し時に値が明示的に渡されたかどうかをチェックするのであれば、「is not」演算子を使うようにしよう。
def foo(x=None):
if x is not None: # デフォルト引数値が上書きされたかどうかをチェック
print('assigned')
else:
print('not assigned')
foo('') # assigned
foo() # not assigned
Copyright© Digital Advantage Corp. All Rights Reserved.