CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: ... (Ellipsis) は任意の処理を示すのにも便利かも

PEP 484 – Type Hints を読んで「なるほど、こういう使い方もあるのか」と気づかれたのでブログに書いておく。 尚、このエントリの内容を実行するには Python 3 以降が必要となる。

使った Python のバージョンは次の通り。

$ python --version
Python 3.6.1

Ellipsis について

Python 3 には Ellipsis というオブジェクトがある。 これはドットを三つ連続させたもので得られる。

>>> ...
Ellipsis

これの使いみちとしてはコンテナオブジェクトでスライスと共に用いられることが多い。 Ellipsis 自体の解説は以前こちらのエントリで紹介している。

blog.amedama.jp

任意の処理を示すためのコードについて

ところで、これまで概念的な説明をするときに書くコードも、なるべく実行できるように書くようにしていた。

例えば、関数ならこんな感じで書くことが多かったように思う。 ここには任意の処理が入りますよ、みたいなのを説明するのにはコメントを使って、中身は pass にするとか。

def f():
    # Do something
    pass

これは、コメントだけだと文法的に正しくないため。

>>> def f():
...     # Do something
...
  File "<stdin>", line 3

    ^
IndentationError: expected an indented block

あるいは docstring を利用して、こんな風にすることもできるかもしれない。

def f():
    """Do something"""

docstring は実のところ単なる文字列なので、それが式になることでこの場合は前述したようなエラーにならない。

任意の処理を … (Ellipsis) で表現する

上記でも伝わりさえすれば問題はないんだけど Ellipsis を使えばさらに分かりやすくなる気がする。

def f():
    # Do something
    ...

Ellipsis 単独でもちゃんとした式なので、上記は Python 3 の処理系がちゃんと解釈できる。

あるいは「この変数には何かが入るよ」みたいな処理も Ellipsis で表現できる。

>>> variable = ...

これも variable に Ellipsis を代入しているだけなので、もちろん有効な Python コードになる。

問題は … が Ellipsis オブジェクトになるのが Python 3 から、っていうところかな。 上記は Python 2 では使うことができない。