1. ホーム
  2. パイソン

[解決済み】新しい言語機能を使用するプログラムで、Pythonのバージョンを確認するにはどうすればよいですか?

2022-04-02 01:36:25

質問

Pythonスクリプトを作成する際に、少なくとも特定の Pythonのバージョンで、優雅に失敗するための正しい方法は何ですか? スクリプトの起動に以前のバージョンの Python が使用された場合、そのスクリプトはどうなりますか?

エラーメッセージを出すのに十分な早期の制御を得るには、どうすればよいでしょうか。 を終了してください。

例えば、ternery 演算子(2.5 の新機能)や "with" ブロックを使用するプログラムがあります。 (2.6の新機能)。 インタプリタのバージョン管理は スクリプトが最初に実行するチェッカールーチンです。 を呼び出す......ただし、そこまではしない。そのかわり スクリプトは、私のルーチンの前に、Pythonのコンパイル時に失敗します。 は呼び出されることすらありません。そのため、このスクリプトのユーザは、次のようなものを見ることになります。 不明瞭なsynaxエラーのトレースバック - これはかなり必要です。 専門家であれば、単純に実行したケースであると推論することができます。 Pythonのバージョンを間違えているのです。

Pythonのバージョンを確認する方法は知っています。問題は、古いバージョンのPythonでは不正な構文があることです。このプログラムを考えてみましょう。

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

2.4で実行すると、次のような結果になります。

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

であって、この結果ではありません。

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(同僚へのチャネリング)

解決方法は?

を使用してテストすることができます。 eval :

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

また with Python 2.5で利用できるのは、単に from __future__ import with_statement .

EDIT: 十分に早い段階で制御を得るために、異なる .py ファイルを作成し、インポートする前にメインファイルで互換性をチェックします(例. __init__.py をパッケージの中に入れてください)。

# __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *