Pythonにおける...(ellipsis)とpassは、一見似たような役割を果たしますが、それぞれ異なる用途と意味を持っています。
...(ellipsis )
ellipsis は3つのドットで表現され、もともとは型ヒントや特殊なケースで使用されていました。現在では、次のような用途に用いられることがあります。
- 未実装のコードを示すplaceholder
関数やメソッドの中身を後から実装する予定がある場合に、...を記述して「ここにコードが入る予定である」と示すことができます。
def my_function():
...
- スライスのプレースホルダーとして使用
特にNumPyなどのライブラリで、データの一部だけを操作したい場合、エリプシスをスライスの一部として使い、「他の部分はすべて含む」という意味を持たせることができます。
import numpy as np
array = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(array[..., 0]) # 先頭のすべての次元を含み、最後の次元のみ0番目を選択
[[1 3]
[5 7]]
- Python 3.10以降での型ヒント
Python 3.10以降では、list[float, ...]のように、任意のサイズのリストを示す型ヒントとしても使われるようになりました。
def process_numbers(nums: list[float, ...]) -> None:
print(nums)
process_numbers([1.2, 3.4, 5.6])
process_numbers([7.1])
process_numbers([10.0, 20.5, 30.1, 40.0])
[1.2, 3.4, 5.6]
[7.1]
[10.0, 20.5, 30.1, 40.0]
from typing import Any
def process_data(data: list[Any, ...]) -> None:
print(data)
process_data([[1, 2, 3], ["a", "b", "c"], ["a", "b", "c", "d"]])
[[1, 2, 3], ['a', 'b', 'c'], ['a', 'b', 'c', 'd']]
pass文
pass文は「何もしない」文で、コードの構造を維持したいが、そこに処理を追加したくない場合に使用されます。
- 空の関数やクラスの定義
関数やクラスを作成する際に、まだ具体的な実装がない場合に使用します。passを使うことで、構文エラーを避けつつ「ここに将来的な処理を追加予定」であることを示すことができます。
def my_function():
pass
- 制御構造のプレースホルダー
if文やforループなどの制御構造内でも、passを使用して空のブロックを作成することができます。これにより、コードの実行を妨げることなく構造を維持できます。
for i in range(5):
pass # 何もしないループ
どちらを使うべきか?
- pass は、クラスや関数、制御構造などで明示的に「何もしない」ことを示したい場合に使用します。
- ... は、スライスや未実装のコードに使うことで、「この部分は未完成」であることや「特定の次元を含む」といった意味を示すことができます。
以上のように、passとエリプシスは共に「何もしない」ためのツールですが、その意味合いや用途に応じて使い分けが求められます。