テック技報最新号へ →
コード

Python 3.15: 「引数が渡されなかった」を表す値は組み込みの sentinel で作る

None も正当な値として受け付けたい引数では、これまで MISSING = object() を自作していた。3.15 からは MISSING = sentinel("MISSING") で、見やすい repr・型ヒントでの利用・コピーや pickle をしても同一性が保たれる番兵が作れる(PEP 661)。

@driscollis · 2026-10-21
#python#python315#typing

これまでの書き方の困りごと

python
_MISSING = object()

def get(key, default=_MISSING):
    ...
    if default is _MISSING:
        raise KeyError(key)
  • help() やエラーメッセージに <object object at 0x7f...> と出て読みにくい
  • copy.deepcopy や pickle を通ると別のオブジェクトになり、is の比較が壊れる
  • 型ヒントで「この番兵か int」を書きにくい(Enum を作るなどの回り道が必要だった)

3.15 の書き方

python
MISSING = sentinel("MISSING")

def get(key: str, default: int | MISSING = MISSING) -> int:
    if default is MISSING:
        raise KeyError(key)
    return default

print(MISSING)  # MISSING
  • 比較は今まで通り is で行う。
  • | で型式に使える。コピーしても同一性が保たれ、モジュールの名前と変数名でインポートできる位置に置けば pickle も通る。

注意点

出典

X の元の投稿を開く