[Pythonクイズ]Pythonバージョン確認コード、使えないのはドレ? 予想外の答えかもPythonステップアップクイズ

Pythonのバージョンをスクリプト内で確認するには幾つかの方法があります。どんなときにどんな方法を使うのがよいか、分かっているかを試してみましょう。

» 2025年09月16日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「Pythonステップアップクイズ」のインデックス

連載目次

Pythonのバージョン確認に使えないものはドレ? Pythonのバージョン確認に使えないものはドレ?

【問題】

 以下はPythonのバージョンをスクリプトで確認しようとしている。この中で使えないものはどれだろう。

import sys
import platform

# 選択肢1
ver = sys.version

# 選択肢2
ver = sys.version_info

# 選択肢3
ver = platform.python_version_tuple()

# 選択肢4
ver = platform.python_version()

Pythonのバージョン確認に使えないものはドレ?

正解できなかったChatGPTさん

 今回も読者の皆さんに出題した問題を、ChatGPT 5/Gemini Flash 2.5/Claude Sonnet 4の3つの大規模言語モデル(LLM)にも考えてもらいました。結果、ChatGPT 5さんだけが不正解という結果になりました。

ChatGPT 5さんに何が!? ChatGPT 5さんに何が!?

 いったいどういうことなのでしょう? この続きは解説の後で!



かわさき

 どうもHPかわさきです。

 「今回は妙に長いぞ」とスクロールバーを見て感じた方はいませんか? 大丈夫です。今回のクイズが長めに思えるのは画面キャプチャーが多めなだけです。内容はないよぅ。いえいえ。ちゃんと内容もありますから、ご安心ください。


【答え】

 ごめんなさい。実は「全てPythonのバージョン確認に使える」が正解でした。1回やってみたかったんですよね、こういうの。もうしないようにしたいと思います(「絶対に」とはいえない)。

全てPythonのバージョン確認に使えるのでした 全てPythonのバージョン確認に使えるのでした

 ただし、それらの値や戻り値には違いがあります。以下で詳しく見ていきましょう。

【解説】

 まずは問題のコードを再掲しておきましょう。

import sys
import platform

# 選択肢1
ver = sys.version

# 選択肢2
ver = sys.version_info

# 選択肢3
ver = platform.python_version_tuple()

# 選択肢4
ver = platform.python_version()

4つの選択肢

 選択肢1の「sys.version」は多くの人がよく使っているのではないでしょうか。sys.version属性の値は次のようにPythonのバージョン、ビルド番号、ビルド日時、使用したコンパイラなどの情報を含む文字列です。

sys.versionの値はPythonのバージョンやその他の情報を含む sys.versionの値はPythonのバージョンやその他の情報を含む

 人が目視でPythonのバージョンを確認したり、詳細な情報(コンパイラ情報やビルド日時など)を取得したりするのに適しているといえます。ただし、プログラムでバージョンを抜き出したいのであれば、他の選択肢の方がよいでしょう。

 次に選択肢2の「sys.version_info」です。こちらは名前付きタプルとしてPythonのバージョンを提供します。

sys.version_info属性はPythonのバージョンを名前付きタプルとして提供する sys.version_info属性はPythonのバージョンを名前付きタプルとして提供する

 名前付きタプルなので「ver.major」や「ver.minor」のようにして、個別の情報にアクセスが可能です。Pythonのバージョン情報を細かくチェックして、バージョンごとに処理を切り分けたいときにはこれが便利でしょう。

 選択肢3の「platform.python_version_tuple()」はPythonのバージョンを「(メジャーバージョン, マイナーバージョン, マイクロバージョン)」というタプルとして返します。

「platform.python_version_tuple()」は「(メジャーバージョン マイナーバージョン, マイクロバージョン)」というタプルを返す(要素は全て文字列),「platform.python_version_tuple()」は「(メジャーバージョン, マイナーバージョン, マイクロバージョン)」というタプルを返す(要素は全て文字列)

 このとき各バージョンは文字列となっているのがキモです。なぜかというと、文字列間の比較で想定外の結果を招く可能性があるからです。

ver = platform.python_version_tuple()
print(ver)  # ('3', '13', '7')

if (ver[0], ver[1]) > ('3', '9'):
    print('python version > 3.9')
else:
    print('python version <= 3.9')

マイナーバージョンを比較したつもり

 Python 3.13環境でこのコードを実行すると次のような結果になります。

「Python 3.13 &lt; Python 3.9」なの? 「Python 3.13 < Python 3.9」なの?

 これは文字列として'13'と'9'を比較すると、'13'が'9'よりも小さいと判定されるからです。というわけで、このような場合にはsys.version_info属性を使うのがオススメといえるでしょう。

 選択肢4の「platform.python_version()」はPythonの「メジャーバージョン.マイナーバージョン.マイクロバージョン」という文字列を返します。Pythonのバージョンが3.13.7なら'3.13.7'という文字列が返されるわけです。

「platform.python_version()」はPythonのバージョンを文字列として返す 「platform.python_version()」はPythonのバージョンを文字列として返す

 これはPythonのバージョンをプログラム内でそのまま使用する(何らかの出力に埋め込むなど)ときには便利に使えるはずです。が、戻り値は文字列なので、やはりこの値を使ってバージョン比較をするにはオススメできないといえるでしょう。

 それぞれの選択肢が返す値はそれぞれに異なっています。状況に応じて、適切なものを使い分けるようにしましょう。


かわさき

 さて、ChatGPTさんは当初、次のような主張をしていました。「sys.version_infoはタプルのようなオブジェクトであり、『バージョン情報を保持する』ためには使えますが、これは文字列ではないため、verを文字列として扱いたい場面ではそのままでは使えません」と。

 つまり、問題を深読みし過ぎて、「バージョン情報は取得できるけど、その値が文字列じゃないことで処理が面倒くさいことがあるからダメ!」と、勝手に結論を出してしまっていたというわけです。でも、まあ見てください。

ここまでハッキリと×を付けられたらねぇ…… ここまでハッキリと×を付けられたらねぇ……

 ハッキリと明快に「×」です。しゃーないです。アナタの間違いデス。そんな気になってしまったのでした。その後、対話を続けていけば、もちろんバージョンを比較して、処理を切り分けることを考えると、選択肢2が一番よいという話もしてくれました。

 ChatGPTさんは頭が良過ぎるからなのか、話の先を見通して勝手に(誰も期待していない)結論を出していましたが、似たようなことは人の世でもよくあります。皆さんも(もちろん、筆者も)気を付けるようにしましょう(笑)。

 なお、『解決!Python』の「Python処理系のバージョンを確認するには」でもこの話題を取り上げているので、よろしかったら見てくださいね。


「Pythonステップアップクイズ」のインデックス

Pythonステップアップクイズ

Copyright© Digital Advantage Corp. All Rights Reserved.

アイティメディアからのお知らせ

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。