pep-0404から次のことがわかりません
Python 3では、パッケージ内の暗黙的な相対インポートは使用できなくなりました。絶対インポートと明示的な相対インポートのみがサポートされています。さらに、スターのインポート(x import *など)は、モジュールレベルのコードでのみ許可されます。
相対インポートとは何ですか?python2でスターのインポートが許可された他の場所はどこですか?例を挙げて説明してください。
pep-0404から次のことがわかりません
Python 3では、パッケージ内の暗黙的な相対インポートは使用できなくなりました。絶対インポートと明示的な相対インポートのみがサポートされています。さらに、スターのインポート(x import *など)は、モジュールレベルのコードでのみ許可されます。
相対インポートとは何ですか?python2でスターのインポートが許可された他の場所はどこですか?例を挙げて説明してください。
相対インポートは、現在のスクリプト/パッケージに関連するパッケージをインポートするたびに発生します。
たとえば、次のツリーについて考えてみます。
mypkg
├── base.py
└── derived.py
今、あなたderived.py
はから何かを必要としbase.py
ます。Python 2では、次のように実行できます(でderived.py
):
from base import BaseThing
Python 3は、「相対」または「絶対」のどちらが必要かが明示されていないため、これをサポートしなくなりましたbase
。つまり、base
システムにインストールされているという名前のPythonパッケージがある場合、間違ったパッケージを取得することになります。
代わりに、パスのようにモジュールの場所を明示的に指定する明示的なインポートを使用する必要があります。あなたderived.py
は次のようになります:
from .base import BaseThing
先頭に.
は「base
モジュールディレクトリからインポート」と書かれています。つまり、に.base
マップされ./base.py
ます。
同様に、(へのマッピングを使用して)のようにディレクトリ階層を上に移動し、次に()のように2レベル上に..
移動するプレフィックスがあります。../
..mod
../mod.py
...
../../mod.py
ただし、上記の相対パスは、現在の作業ディレクトリではなくderived.py
、現在のモジュール( )が存在するディレクトリからの相対パスであることに注意してください。
@BrenBarnは、スターインポートのケースについてすでに説明しています。完全を期すために、私は同じことを言わなければなりません;)。
たとえば、いくつかのmath
関数を使用する必要がありますが、それらは1つの関数でのみ使用します。Python 2では、セミレイジーになることが許可されていました。
def sin_degrees(x):
from math import *
return sin(degrees(x))
Python2ではすでに警告がトリガーされていることに注意してください。
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
最新のPython2コードでは、次のいずれかを実行する必要があります。Python3では、次のいずれかを実行する必要があります。
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
また:
from math import *
def sin_degrees(x):
return sin(degrees(x))
相対的なインポートについては、ドキュメントを参照してください。相対インポートとは、絶対からではなく、モジュールの場所を基準にしてモジュールからインポートする場合ですsys.path
。
に関してはimport *
、Python 2は関数内でスターのインポートを許可しました。たとえば、次のようになります。
>>> def f():
... from math import *
... print sqrt
Python 2(少なくとも最近のバージョン)では、これに対して警告が発行されます。Python 3では、これは許可されなくなり、モジュールのトップレベルでのみスターインポートを実行できます(関数またはクラス内では実行できません)。
Python2とPython3の両方をサポートするには、以下のように明示的な相対インポートを使用します。それらは現在のモジュールに関連しています。2.5からサポートされています。
from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle
MichałGórnyの回答に別のケースを追加しました:
相対インポートは、現在のモジュールの名前に基づいていることに注意してください。メインモジュールの名前は常に" __main__
"であるため、Pythonアプリケーションのメインモジュールとして使用することを目的としたモジュールは、常に絶対インポートを使用する必要があります。