失敗した将来の機能のインポートをどのように適切に処理しますか? ユーザーが Python 2.5 を使用して実行していて、モジュールの最初のステートメントが次の場合:
from __future__ import print_function
このモジュールを Python 2.5 用にコンパイルすると、次のエラーで失敗します。
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
Python >= 2.6 でプログラムを再実行する必要があることをユーザーに通知し、その方法についていくつかの指示を提供したいと思います。ただし、PEP 236を引用するには:
future_statement の前に表示できる行は次のとおりです。
- モジュールのドキュメント文字列 (存在する場合)。
- コメント。
- 空行。
- その他の future_statements。
だから私は次のようなことはできません:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
それが得られるからです:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
PEP からのこのスニペットは、インラインで行うことを期待しているようです:
Q: future_statements を try/except ブロックでラップしたいので、実行している Python のバージョンに応じて異なるコードを使用できます。なぜできないのですか?
A: すみません!try/except はランタイム機能です。future_statements は主にコンパイル時のギミックであり、try/except はコンパイラが完了してからずっと後に発生します。つまり、try/except を実行するまでに、モジュールに有効なセマンティクスは既に完了しています。トライ/エクセプトでは、達成すべきと思わ れることを達成できないため、単純に許可されていません。また、これらの特別なステートメントを簡単に見つけて認識できるようにしたいと考えています。
__future__ を直接インポートし、その中の情報を sys.version_info と一緒に使用して、実行中のリリースが特定の機能のステータスに関連してどこにあるのかを把握できることに注意してください。
アイデア?