None 型

概要

None型は値がないことを示すための型です。 None型には型名と同じNoneという値しかありません。 Noneは他のプログラミング型言語で使われる「null」や「void」と似ています。

返り値がない関数の返り値をあえて得るとNoneを得ることができます。 また、関数の処理が失敗したことを示したい場合などにNoneを返すことがあります。 関数から返された値をis演算子でNoneか否かを判定し、 Noneでない場合のみ処理を続行するといった使い方をします。

None型ににたEllipsis型というものもあり、こちらは「何かがある」ということ示すための型です。 Noneよりも使いみちがありませんが、開発中のプログラムでコードブロックになにも処理がない場合にEllipsisを使ったりします。 何もコードブロックに書かないと文法エラーになるため、とりあえず何かを書かないといけないということでEllipsisを書いておきます。 そのような場合はEllipsisの値である「...」を使います。

None型の特徴

None型は「値がない」ということを表明するための特別な型です。 None型は型名と同じ「None」という値しか持っていません。 ブール型にはTrueとFalseの2値しか持っていないのと似ています。

「値がない」ということを示すための型ですので、 返り値が定義されていない関数やメソッドを呼び出した場合などに使われます。

>>> a = print('hello')
hello
>>> print(a)
None

プログラミング言語によっては返り値がない関数の返り値を代入しようとするとエラーとなります。 Pythonはそうはならずに「何もない」という「None」を返り値として返しているためエラーとなりません。 Noneは別名「 ヌルオブジェクト 」とも呼ばれており、 他のプログラミング言語では「null」と表記されることがよくあります。

None型の基本操作

複雑な関数やメソッドによっては、処理が失敗した場合にNoneを返すものがあります。 たとえばネットワークやデータベースに接続する処理に成功した場合は、それを操作するためのオブジェクトを返して、 失敗した際はNoneを返すといったものになります。

返り値がNoneか否かを判定することで、関数やメソッドの処理が成功したか失敗したかを判定できます。

自分でプログラムを書く際はこのNoneを使って成否を示す方法は簡単に実装できます。 ただ、失敗をした際は例外(エラー)を発生させ、関数を利用する側で例外処理で対応をするのが一般的な実装方法です。

None型の判定

値がNoneか否かを判定するには「is演算子」を使うことが推奨されています。 値がNoneであった場合はTrueを返します。 「not is」とすることで、Noneでなかった場合にTrueを返すこともできます。

>>> a = None
>>> a is None
True

>>> a = 0
>>> a is None
False

>>> a is not None
True

is演算子の代わりに「==演算子」を使っても判定はできます。 ただ、==演算子の挙動はプログラマが定義することができるため、100%正しい動きをする保証はできません。 is演算子を使うことを推奨します。

Ellipsis オブジェクト

None型に似た「 Ellipsis型 」というものも存在します。 この型も値を一つしか持っておらず、Ellipsisという同名の値となります。 Ellipsisには別の書き方もあり「 ... 」と書くと、それはEllipsisとして扱われます。

Noneは「何もない」ということを表明するためのものですが、 Ellipsisはその逆で「何かある」ということを表明するためのものです。

使う箇所は限定的ですが、処理がなにもない関数や条件分岐及びループのコードブロックで使われます。 「何かある」ということなので、今は実装はないが後で実装する予定といった場合に使います。

def function():
  ...

function()

上記のようにEllipsisとではなく、「...」と書くと「省略」というようにも見えるため、 後で書きますという意図が伝わりやすいはずです。 コードブロックにはなにか1行は書かないと文法エラーになってしまいますので、 Ellipsisを書くようにしてください。

pass文

Ellipsisオブジェクトが使われるようになる前は、その代わりに「 pass文 」が使われていました。 passはifやforと同じく予約語で、何もしないことを表記するために使います。

先のEllipsisを使った書き方は、pass文を使うと以下のようになります。

def function():
  pass

function()

使われ方は両者に大差はありませんが、passは文法であり、Ellipsisは値です。 どちらを使うかはプログラマ次第ですが、Elllipsisの「...」という書き方は省略という意図が明確に伝わるため、 私は「...」を好んで使っています。