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