世界を動かす技術を、日本語で。

Python 3.15: 注目されなかった機能

概要

Python 3.15は、多くの新機能と改善を含む大型アップデート。 asyncio.TaskGroupのキャンセル簡易化や、コンテキストマネージャのデコレータ強化。 スレッドセーフなイテレータの導入でマルチスレッド処理が容易に。 Counterクラスのxor演算や、イミュータブルなJSONオブジェクト対応も追加。 小さな変更も実用性が高く、開発体験の向上に寄与。

Python 3.15の注目すべき小規模新機能

  • Python 3.15.0b1 の機能フリーズにより、今年後半にリリースされる新機能が確定
  • lazy importstachyon profiler などの大型機能だけでなく、小規模な改善も多数
  • 小さな機能も 開発体験向上 に大きく貢献

asyncio.TaskGroupのキャンセル簡易化

  • asyncio の変更点は少ないが、 TaskGroup のキャンセルが簡単に
  • TaskGroupは 構造化並行処理 を提供し、複数タスクをクリーンに管理
  • 以前は例外とcontextlib.suppressの組み合わせで グレースフルなキャンセル を実現
  • 3.15 からは TaskGroup.cancel() で簡単に全タスクをキャンセル可能
  • 例外処理不要で、より直感的な制御が可能

コンテキストマネージャのデコレータ機能強化

  • デコレータ の実装は難易度が高いが、 contextmanager はデコレータとしても利用可能
  • 3.15からは ContextDecorator が関数の型を判定し、 イテレータasync関数 にも対応
  • デコレータが 関数全体のライフサイクル をカバーし、予期せぬ動作を回避
  • コードの可読性・保守性向上に寄与

スレッドセーフなイテレータ

  • イテレータ はデータソースとコンシューマの分離を実現
  • スレッド間フリースレッド 環境ではデフォルトでスレッドセーフではない
  • threading.serialize_iterator でイテレータを簡単にスレッドセーフ化
  • threading.synchronized_iterator デコレータや threading.concurrent_tee も追加
    • concurrent_teeは値を複製して複数イテレータに分配
  • これにより Queue に依存せず、既存抽象化を維持したまま マルチスレッド対応 が可能

Counterクラスのxor演算追加

  • collections.Counter は頻度集計が簡単なクラス
  • 既存の加算・減算・積集合・和集合に加え、 xor(排他的論理和) 演算が追加
  • Counter同士のxorで、重複しない要素のみを抽出可能
  • 実用例は少ないが、 操作の完全性 が向上

イミュータブルなJSONオブジェクト対応

  • frozendict の追加で、全てのJSON型を イミュータブル(ハッシュ化可能) に表現可能
  • json.load/json.loadsarray_hook パラメータが追加
    • 例:array_hook=tuple, object_hook=frozendict でイミュータブルな構造に変換
  • データの セキュリティ一貫性保持 に有用

まとめ

  • Python 3.15 は大規模な進化だけでなく、 日々の開発を支える小さな改善 も多数
  • 新機能を活用することで、 より堅牢で効率的なPythonコード の実現が可能

Hackerたちの意見

Pythonに10年もハマってたけど、楽しくて仕事もやりやすかったな。でも、今年だけで10万行以上削除して、AIコードボットの時代に合わせて速い言語に移行してる。最近は主にGoに移ってるよ。

それは面白いね!もしよかったら、プロジェクトはプロのものだったのか、それとも個人のものだったのか教えてもらえる?

同じく、Pythonが機械学習以外でどう生き残るのか分からないよ。私たちが使ってたサービスは、かなり速くて信頼性も高くなった。Rustを使ったけど、そんなに難しくなかったよ。

でもGoは科学や機械学習には最悪だね、ライブラリが全然足りてない。ラッピングC APIの話も弱いし、LLMの助けがあってもね。フィルターやウィンドウ処理、オーバーラップとかを使った信号処理のものを書くのは、今あるライブラリじゃ全然簡単じゃないよ。

最初は簡単そうだけど、これからそのプロジェクトのメンテナンスはどうするつもり?特にもっと複雑な機能を追加する場合は?Pythonでプロトタイプを作ってから変換するのが一つの方法かもしれないね。

俺はそうは思わないな。Pythonのトークンの価値は、低レベル言語よりもずっと高いよ。

そもそもなんでPythonを使うのか興味ある?プログラミングについて何も知らない人へのアドバイス、何を勧める?

これについては3つのことが信じがたいな。- 100K行のコードを書いたって?(俺はずっと小さいC++プロジェクトに関わってきたけど) - そのコードをPythonで書いたって?(Pythonの目的はコードを少なく書くことだろうに) - それを削除したって?(何も削除しない方がいいよ、今のモダンなVCSの意味はそこにあるんじゃないの?)でも、好きにすればいいけど。

Djangoみたいな包括的なウェブフレームワークをGo用に探してるんだけど、見つけたら即ヒットだな。

この例から: 「lazy from typing import Iterator def stream_events(...) -> Iterator[str]: while True: yield blocking_get_event(...) events = stream_events(...) for event in events: consume(event)」 Pythonに「レイジーインポート」ってやっと実装されたの?この変更見逃してたかも。これってPython 3.15からのものなの、それともそれ以前?

そう、3.15以上だよ。

Pythonって本当に変な言語だよね。レイジーインポートは、1000個のインポートがあるAIコードベースのモンスターに対する応急処置みたいなもんだし(そのうちの1%は多分Shai Huludだろうね)。しかも、タイプインポートも遅すぎて、通常の型なし実行中に使わないと無効にしないといけないらしい。Instagramや他の企業がプロフェッショナルな言語を求めるなら、変な機能を無理やり詰め込むんじゃなくて、GoやPHPに切り替えた方がいいと思う。

Hacker Newsで議論の続きを見る