2026年10月13日、PythonのWebフレームワークの土台として使われるStarletteの1.8.0が公開されました。この版から、Python 3.10のサポートを終え、3.11以上が必須になっています。
Starletteは、FastAPIの内部で使われているライブラリです。翌14日に公開されたStreamlit 1.66も、同じく3.10のサポートを終えました。
Python 3.10そのもののサポートは、10月1日に終わっています。そこから2週間、ライブラリの世界でも3.10からの卒業が一気に進んでいるのです。
今回は、主要なライブラリの最新版がどのPythonに対応しているのかを、実際に調べてみました。
まずは何が起きているのかを整理しよう¶
最初に、この2週間で3.10のサポートを終えた主なリリースを表にまとめます。日付と必要なPythonは、各ライブラリの公式の変更履歴とPyPIの記録にもとづいています。
| ライブラリ | 版 | 公開日 | 必要なPython |
|---|---|---|---|
| SQLAlchemy | 2.1.0 | 2026年9月24日 | 3.11以上 |
| Starlette | 1.8.0 | 2026年10月13日 | 3.11以上 |
| Streamlit | 1.66.0 | 2026年10月14日 | 3.11以上 |
SQLAlchemyは、10月に3.10のサポートが終わることを見越して、8月の時点で3.10を外していました。その経緯は、こちらで紹介しています。【関連記事】SQLAlchemy 2.1がリリース
Python 3.10のサポート終了そのものについては、こちらで詳しく取り上げました。【関連記事】Python 3.15の正式版は10月9日に延期、3.10はサポート終了へ
Starlette 1.8.0で変わったこと¶
まずは、今回のニュースの中心であるStarlette 1.8.0の中身を見ておきましょう。変更履歴の冒頭には、この版でPython 3.10のサポートを終え、HTTP 103 Early Hintsを加えたと書かれています。
HTTP 103 Early Hintsとは¶
HTTP 103 Early Hintsは、サーバーが本番の応答を返す前に、先に必要になりそうなファイルを知らせるための仕組みです。ブラウザは、その知らせを受けて、CSSや画像などを前もって読み込み始められます。
1.8.0では、Request.send_early_hints()というメソッドが加わりました。変更履歴によると、ASGIの拡張機能を通じて、この103の応答を送れるようになっています。
ASGIは、PythonのWebアプリとサーバーをつなぐための約束ごとです。このメソッドが実際に働くかどうかは、使うサーバー側の対応にもよる点に注意してください。
そのほかの主な修正¶
変更履歴には、ほかにも細かな修正が並んでいます。初心者にも関係しそうなものを表にまとめます。
| 内容 | 意味 |
|---|---|
| FileResponseの転送を、接続が切れたら止める | 利用者が途中でページを閉じたときに無駄な送信を続けない |
| 範囲指定のダウンロードで無限ループしないように | ファイルの終わりで処理が止まらなくなる問題を修正 |
| GZipMiddlewareがgRPCの通信を圧縮しない | 圧縮すると困る種類の通信を既定で除外 |
| セッションのクッキーの扱いを修正 | max_age=0のときに正しく期限切れにする |
なかでも、ファイルの終わりで処理が止まらなくなる問題の修正は、サーバーを守るうえで大切な変更です。
主要ライブラリの最新版は、どのPythonに対応している?¶
では、ほかのライブラリはどうなっているのでしょうか。2026年10月16日時点のPyPIの記録から、よく使われるライブラリの最新版が必要とするPythonを調べてみました。
| ライブラリ | 最新版 | 必要なPython |
|---|---|---|
| NumPy | 2.5.4 | 3.12以上 |
| SciPy | 1.18.1 | 3.12以上 |
| Django | 6.1.2 | 3.12以上 |
| pandas | 3.0.6 | 3.11以上 |
| matplotlib | 3.11.2 | 3.11以上 |
| scikit-learn | 1.9.1 | 3.11以上 |
| FastAPI | 0.143.2 | 3.10以上 |
| Pydantic | 2.14.1 | 3.10以上 |
| Polars | 2.0.0 | 3.10以上 |
| pytest | 9.1.1 | 3.10以上 |
こうして並べると、3.10で最新版が使えないライブラリがすでに多いことがわかります。NumPyやDjangoのように、3.12以上を求めるライブラリも珍しくありません。
一方で、FastAPIやPydanticのように、まだ3.10を受け付けているライブラリもあります。ただし、これも時間の問題だと考えておいたほうがよいでしょう。
FastAPIは3.10でも入るけれど¶
ここで少し面白いのが、FastAPIとStarletteの関係です。FastAPI 0.143.2は3.10以上で動きますが、内部で使うStarletteの最新版1.8.0は3.11以上が必要です。
PyPIの記録によると、FastAPI 0.143.2が求めるのはstarlette>=0.46.0です。3.10の環境では、pipが3.10に対応した1つ前のStarlette 1.7.0を選んで入れることになります。
つまり、3.10でもFastAPIは動きますが、Starletteの新機能や修正は受け取れません。エラーが出ないまま、少しずつ取り残されていくのが、古いPythonを使い続けるときの怖いところです。
FastAPIそのものについては、こちらで紹介しています。【関連記事】PythonのFastAPIとは?
pipが選ぶ版を実際に確かめた¶
本当にpipが古いStarletteを選ぶのか、pip downloadで確かめてみました。--python-versionを付けると、手元とは別のPythonを想定して、どの版が選ばれるかを調べられます。
pip download starlette --no-deps --python-version 3.10 --only-binary=:all:
pip download starlette --no-deps --python-version 3.11 --only-binary=:all:
3.10を想定した1行目ではstarlette-1.7.0-py3-none-any.whlが、3.11を想定した2行目ではstarlette-1.8.0-py3-none-any.whlがダウンロードされました。pipは、エラーを出さずに静かに古い版を選ぶわけです。
自分の環境で使えるかを確かめるコード¶
使いたいライブラリの最新版が、自分のPythonで使えるのかを確かめたい。そんなときは、PyPIが公開しているJSONの情報を使うと便利です。
次のコードは、いくつかのライブラリについて、最新版が求めるPythonのバージョンを取得し、3.10、3.11、3.12で使えるかを判定します。判定には、pipの内部でも使われているpackagingのSpecifierSetを使っています。
import json
import urllib.request
from packaging.specifiers import SpecifierSet
PACKAGES = ["starlette", "streamlit", "sqlalchemy", "numpy", "fastapi"]
def latest_info(name):
url = f"https://pypi.org/pypi/{name}/json"
with urllib.request.urlopen(url, timeout=10) as res:
info = json.load(res)["info"]
return info["version"], info["requires_python"]
for python in ["3.10", "3.11", "3.12"]:
print(f"--- Python {python} ---")
for name in PACKAGES:
version, requires = latest_info(name)
ok = python in SpecifierSet(requires)
mark = "OK" if ok else "NG"
print(f"{mark} {name} {version}({requires})")
2026年10月16日に、手元のPython 3.11で実行した結果です。3.10の部分を抜き出して紹介します。
--- Python 3.10 ---
NG starlette 1.8.0(>=3.11)
NG streamlit 1.66.0(>=3.11)
NG sqlalchemy 2.1.4(>=3.11)
NG numpy 2.5.4(>=3.12)
OK fastapi 0.143.2(>=3.10)
3.11ではNumPyだけがNGになり、3.12ではすべてOKになりました。使いたいライブラリの名前をPACKAGESに入れれば、自分のプロジェクトでも同じように調べられます。
SpecifierSetのしくみ¶
SpecifierSet(">=3.11")のように、バージョンの条件を表す文字列からオブジェクトを作ります。そこへ"3.10" inのようにバージョンを渡すと、条件を満たすかどうかをTrueかFalseで返してくれます。
バージョンの比較を自分で文字列として書くと、3.9と3.10の大小を取り違えるような間違いが起きがちです。こうした比較は、専用の道具に任せるのが安全です。
3.10から移るなら、どのバージョンを選ぶ?¶
最後に、これから移行するならどのバージョンを選べばよいかを考えてみます。今回の調査からは、次のような目安が言えそうです。
| 移行先 | 向いている場面 |
|---|---|
| Python 3.12 | NumPyやDjangoなど、3.12以上を求めるライブラリを使う場合の最低ライン |
| Python 3.13 | セキュリティ修正の期間が長く、主要ライブラリの対応も十分な、無難な選択 |
| Python 3.14 | 新しい機能も使いたいが、正式版から1年たって落ち着いたものを選びたい場合 |
| Python 3.15 | 学習用や、最新の機能を試したい場合 |
これは筆者の考える目安で、正解は使うライブラリによって変わります。上のコードで、使いたいライブラリをひと通り確かめてから決めるのが確実です。
Pythonのバージョンの切り替え方は、こちらで手順を追って解説しています。【関連記事】Pythonのバージョンを変更する方法
私は10年ほどエンジニアとして開発に関わってきましたが、Pythonを2つも3つも飛ばして一気に上げたときほど、思わぬところで苦労しました。サポートが切れたタイミングで、こまめに1つずつ上げていくほうが、結局は手間が少なく済みます。
まとめ¶
Python 3.10のサポートが終わってから2週間で、Starlette 1.8.0やStreamlit 1.66.0など、主要なライブラリが続々と3.11以上を必須にしています。NumPyやDjangoのように、すでに3.12以上を求めるライブラリもあります。
3.10を使っている方は、エラーが出ていなくても、少しずつ取り残されていきます。この機会に、使っているライブラリの対応状況を確かめてみてください。
ここまでお読みいただきありがとうございました。