古いバージョンのPython へのサポートをやめる

古いバージョンのPythonへのサポートを取りやめる能力については、標準的な コアとなるメタデータの仕様 1.2 仕様の Requires-Python アトリビュートで有効化されています。

Pip のような Metadata 1.2+ のインストーラは、動作中の Python ランタイムのバージョンとパッケージのメタデータで要求されているバージョンを比較突合することで、この仕様を遵守しようとします。もし両者が一致しなければ、その Python ランタイムでサポートされているパッケージ配布物の中で最新のものをインストールしようと試みます。

パッケージのメタデータにある Requires-Python 属性を修正することで、古いバージョンの Python へのサポートを削除するのにこのメカニズムを利用することができます。

要求事項

このワークフローは、パッケージをインストールしようとするユーザが Pip [1] か、または、Metadata 1.2 の仕様を満足する別のインストーラを使うことを要求します。

universal wheelsの取り扱い

伝統的には、Python 2 と Python 3 の両方に文法的な互換性のある Python ソースコードを提供する Setuptools プロジェクトは、 py2.py3 というタグをその名前の中に持つ wheels を生成します。 Python 2 へのサポートをやめる時には、このタグをただの py3 に変更するのを忘れないことが重要です。これは、しばしば、 setup.cfg の中の [bdist_wheel] セクションで universal=1 として設定されています。

このメソッドを使うのであれば、このオプションないしセクションを削除するか、または、明示的に universal0 に設定してください。

# setup.cfg

[bdist_wheel]
universal = 0  # Make the generated wheels have "py3" tag

ヒント

setup.py から直接に呼び出すことは 非推奨 になっていて、コマンドラインで --universal フラグを渡すことでこの設定を上書きできるでしょう。

要求する Python のバージョンを定義する

1. twine のインストール

twine の最新版が利用可能であることを確実にしておきましょう。やり方は:

python3 -m pip install --upgrade twine
py -m pip install --upgrade twine

2. サポートする Python 配布物のバージョンの範囲を指定する

プロジェクトがどのバージョンの Python 配布物をサポートしているかを宣言するバージョンレンジ <version range> を pyproject.toml 内に設定しましょう。 requires-python 設定フィールドは、 Requires-Python コアメタデータに対応しています:

[build-system]
...

[project]
requires-python = ">= 3.8" # At least Python 3.8

「少なくとも Python 3.9」のような、バージョンの範囲や除外のルール (で バージョン指定子 仕様に合致するもの) を指定することができます。あるいは、「少なくとも Python 3.7 かそれ以上、しかし、 3.7.0 と 3.7.1 のポイントリリースを除く」:

requires-python = ">= 3.9"
requires-python = ">= 3.7, != 3.7.0, != 3.7.1"

Setuptools ビルドバックエンドを使っているなら、もっと詳しいことは dependency-management 説明文書に当たってみてください。

注意

例えば ">=3.8, < 3.10" のようにバージョン範囲に上限を加えることを避けましょう。そうすることで別のエラーやバージョンコンフリクトを引き起こすかもしれません。もっと詳しくは、 discourse-discussion を見てください。

3. 公開の前にメタデータを検証する

Python のソースコードパッケージ (あなたがダウンロードしたzipファイルやtar.gzファイル) の中には、PKG-INFO という名前のテキストファイルがあります。

このファイルは、ソースコードパッケージを生成するときに、 ビルドバックエンド によって生成されます。このファイルには、一連のキーと値を含んでいて、キーのリストは PyPA 標準メタデータフォーマットの一部です。

生成されたファイルの内容はこのようになっています:

tar xfO dist/my-package-1.0.0.tar.gz my-package-1.0.0/PKG-INFO

パッケージを公開する前に、以下のことが適切かどうかを検証してください。

  • アップグレードが正しく終われば、 Metadata-Version の値が 1.2 かそれ以上になっているはずです。

  • Requires-Python フィールドが設定されていて、設定ファイルで指定したものに一致しているはずです。

4. パッケージを公開する

プロジェクトを PyPI にアップロードする で示唆されたように進めましょう。

Python のバージョンをサポートから外す

人々がまだ依存しているバージョンが一旦ドロップされればダウングレードせざるを得なくなるので、原則として、 Python のバージョンに対するメタデータのサポートは可能な限り長く保たれるべきです。しかしながら、特定のバージョンをサポートすることが、新しい機能の阻害要因になるとか、他の問題が起きるとかする場合は、メタデータの Requires-Python は修正されるべきです。もちろん、これは、プロジェクトが安定的で広範囲のユーザをよくカバーするか否かにも依存します。

バージョン互換性の変更は、それぞれ、それ自身のリリースを持つべきです。

Tip

Python バージョン (のサポート) を落とす時は、使われているバージョン群を (テスト用の環境のような) 目にみえる場所に使用するように更新することと同様に、プロジェクトのソースコードのシンタックスを全般的に更新することが値打ちのあるものになるかもしれません。 pyupgraderuff のようなツール類が、この作業の幾らかを自動化してくれるでしょう。