Python の相対インポートはもはや強く推奨されていませんが、その場合は absolute_import を使用することを強くお勧めします。
Guido自身を引用しているこの議論を見てください:
「これはほとんど歴史的なことではありませんか?新しい相対インポート構文が実装されるまで、相対インポートにはさまざまな問題がありました.短期的な解決策は、それらを使用しないことを推奨することでした.長期的な解決策は、明確な構文を実装することでした.今反勧告を撤回する時が来ました. もちろん、船外に出ることはありません.
OPは、次のように言うPEP 328を正しくリンクしています:
いくつかのユースケースが提示されましたが、その中で最も重要なものは、サブパッケージを編集することなく大きなパッケージの構造を再配置できることです。さらに、パッケージ内のモジュールは、相対インポートなしでは簡単にインポートできません。
ほぼ重複する質問も参照してくださいPythonで相対インポートを使用する場合または理由
もちろん、それはまだ好みの問題として残っています。相対インポートを使用してコードを移動する方が簡単ですが、予期せず問題が発生する可能性もあります。インポートの名前を変更することはそれほど難しくありません。
PEP 328 からの新しい動作を強制するには、次を使用します。
from __future__ import absolute_import
この場合、暗黙的な相対インポートはできなくなります (例:import localfile
のみ動作しなくなりますfrom . import localfile
)。クリーンで将来性のある動作のためには、absolute_import を使用することをお勧めします。
重要な警告は、 PEP 338およびPEP 366のため、相対インポートでは python ファイルをモジュールとしてインポートする必要があることです。相対インポートを持つ file.py を実行することはできませんValueError: Attempted relative import in non-package
。
最適なアプローチを評価する際には、この制限を考慮する必要があります。Guido は、どのような場合でも、モジュールからスクリプトを実行することに反対しています。
私は、これと __main__ 機構の他の提案されたいじりについて -1 です。唯一の使用例は、たまたまモジュールのディレクトリ内に存在するスクリプトを実行しているようです。これは、私が常にアンチパターンとして見てきたものです。私の考えを変えさせるには、そうではないことを私に納得させなければなりません。
この問題に関する徹底的な議論は SO で見つけることができます。再。Python 3 これは非常に包括的です: