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

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に切り替えた方がいいと思う。

3.15: https://docs.python.org/3.15/whatsnew/3.15.html#whatsnew315-...

以前のPythonバージョンでは、モジュールレベルで def __getattr__(name: str) -> object: を実装することで回避できることに注意してね。

モジュールスコープで型ヒントを使うのに、ここでのレイジーインポートのメリットって何? アノテーションの遅延評価が必要になるのかな? それってデフォルトでは有効になってないと思うんだけど。

この件はボーナスセクションにしておいたんだけど、カウンターでの集合演算を使ったことがないから、特にxorの使い道を考えるのがすごく難しいんだ。でも、開発者たちが完全性のために追加してくれたのは感謝してる。対称差については、こちらをチェックしてみてね。 https://en.wikipedia.org/wiki/Symmetric_difference

そうだけど、カウンターに適用すると、それは多重集合の対称差になるから、自然な定義がないんだ。提案を理解していれば、カウントの差の絶対値として定義されることになるけど、それは結合的ですらない。もし偶数だけを考慮すれば、F_2での加算として解釈できるかもしれないけど、実際にこういうのをどう使うかは難しいと思う。

俺はPythonの開発者じゃないけど、そのエコシステムにはすごく敬意を持ってる。でもさ、最近ニュースでサプライチェーン攻撃が話題になってる中、非Pythonの人たちが簡単にPythonアプリをインストールできる方法を作ってくれないかな?自分の$HOMEに完全にアクセスできるウイルスに感染するのが怖いんだよね…。

プログラムをVMで動かす以外にできることはほとんどないね。Linuxディストロは、アプリケーションをそれを実行するユーザーとは別のものとして考えるようには設計されてないから。そうするには全く違うセキュリティモデルが必要で、Pythonランタイムはそれに対応してない。

UNIX(やそれに似たOS)には、呼び出し元と呼び出し先の間にセキュリティバリアが全くないんだよね。これをPythonが簡単に直せるわけじゃない。権限を強化したり減らしたりする方法はあるけど、シェルやスクリプト言語はどんな現代のOSでもこの問題を抱えてる。UNIXのやり方としては、別のユーザーとしてプロセスを実行することで防ぐんだけど、みんなそれをやりたがらないみたい。自分のUIDで実行されているプロセスは、自分のUIDが所有しているデータや見えるデータにアクセスできるってことは常に考えておくべきだよ。情報漏洩のリスクを減らすことはできるけど、それは低いところにある果実を守るための「ワック・ア・モール」的な対策であって、絶対的な保証ではないからね。これはUNIXの仕組みそのものによるものなんだ。[0] [0] https://man7.org/linux/man-pages/man7/credentials.7.html

このアップデートがLLMの事前学習に反映されるのを待たなきゃいけないなんて、ちょっと面白いよね。

これに対する解決策ってマジでないの?トレーニング後に何かできることはないかな?例えば、新しい機能をSKILLS.mdに追加するとか?でも、ここでのトレードオフはもちろんトークンだよね。

Python 3.15がイテレータの同期プリミティブを追加したのはいいね! https://docs.python.org/3.15/library/threading.html#iterator.... これで、スレッド生成器パッケージにうまく補完されるよ。今はスレッド/プロセス+ジェネレーター+キューを使ってこれを実現してるんだ。 https://pypi.org/project/threaded-generator/

Pythonの内部や管理についての良いインタビューがあるよ。特にフリースレッディングに関してね。 https://alexalejandre.com/programming/interview-with-ngoldba...

スレッドセーフなイテレータ? まだこの話題を続けてるの? 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よ、15年近く君のために書いてきた。君が恋しいけど、もうそうでもないんだ。君のせいじゃない、人生が変わったから。