193

pep-0404から次のことがわかりません

Python 3では、パッケージ内の暗黙的な相対インポートは使用できなくなりました。絶対インポートと明示的な相対インポートのみがサポートされています。さらに、スターのインポート(x import *など)は、モジュールレベルのコードでのみ許可されます。

相対インポートとは何ですか?python2でスターのインポートが許可された他の場所はどこですか?例を挙げて説明してください。

4

4 に答える 4

295

相対インポートは、現在のスクリプト/パッケージに関連するパッケージをインポートするたびに発生します。

たとえば、次のツリーについて考えてみます。

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))
于 2012-08-29T08:08:42.613 に答える
15

相対的なインポートについては、ドキュメントを参照してください。相対インポートとは、絶対からではなく、モジュールの場所を基準にしてモジュールからインポートする場合ですsys.path

に関してはimport *、Python 2は関数内でスターのインポートを許可しました。たとえば、次のようになります。

>>> def f():
...     from math import *
...     print sqrt

Python 2(少なくとも最近のバージョン)では、これに対して警告が発行されます。Python 3では、これは許可されなくなり、モジュールのトップレベルでのみスターインポートを実行できます(関数またはクラス内では実行できません)。

于 2012-08-29T07:32:12.087 に答える
13

Python2とPython3の両方をサポートするには、以下のように明示的な相対インポートを使用します。それらは現在のモジュールに関連しています。2.5からサポートされています。

from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle
于 2015-10-20T18:16:37.850 に答える
5

MichałGórnyの回答に別のケースを追加しました:

相対インポートは、現在のモジュールの名前に基づいていることに注意してください。メインモジュールの名前は常に" __main__"であるため、Pythonアプリケーションのメインモジュールとして使用することを目的としたモジュールは、常に絶対インポートを使用する必要があります。

于 2018-08-09T20:27:11.347 に答える