症状

  • 環境検出スクリプトが、Python 3.10をPython 3.1と誤って認識します。
     

  • 文字列比較を使用した条件付きロジックが、誤った結果を生成します。

if platform.python_version() < "3.9":
    ...
  • 3.10では正しく動作しない可能性があります。

原因

一部のツールやスクリプトは、整数のタプルとして解析するのではなく、バージョン文字列を単純に比較していました。文字列比較は辞書式順序で行われます。「3.10」は2番目の文字位置で「1」が「9」より小さいので、「3.9」よりも前に来ます。

この問題は、2桁のマイナーバージョンに対応していなかった古いpipインストーラー、tox設定、内部デプロイメントスクリプトで発生しました。Python 3.10移植ガイドにも記載されています。

修正/ベストプラクティス

1) 比較にはsys.version_infoを使用する

import sys

if sys.version_info < (3, 9):
    print("Python < 3.9 detected")

sys.version_infoはタプルのような構造(major, minor, micro, releaselevel, serial)を返し、数値比較に安全です。

2) パッケージングにはpackaging.versionを使用する

from packaging import version
import platform

if version.parse(platform.python_version()) < version.parse("3.9"):
    ...

3) ツールの更新

  • pip、setuptools、tox、CIランナーをアップグレードします。新しいバージョンでは3.10以降を正しく処理します。

  • 次のような生の文字列比較について、シェルスクリプトと設定ファイルを監査します。

if [ "$(python3 --version)" \< "Python 3.9" ]; then ...

将来これを回避する方法

  • 常にバージョンを数値的に解析し、辞書式順序で解析しないでください。
     

  • 今後のリリース候補(例:3.13.0rc1)に対してバージョンチェックをテストします。
     

  • Python開発者ガイドのリリースカレンダーを参考に、2桁のマイナーバージョンを予測します。