importステートメントpython3の変更


177

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

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

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

回答:


277

相対インポートは、現在のスクリプト/パッケージを基準にしてパッケージをインポートするときに必ず発生します。

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

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関数を使用する必要がありますが、それらは単一の関数でのみ使用します。Python 2では、あなたは半怠惰であることが許可されていました:

def sin_degrees(x):
    from math import *
    return sin(degrees(x))

Python 2ですでに警告がトリガーされていることに注意してください。

a.py:1: SyntaxWarning: import * only allowed at module level
  def sin_degrees(x):

最新のPython 2コードでは、Python 3では次のいずれかを実行する必要があります。

def sin_degrees(x):
    from math import sin, degrees
    return sin(degrees(x))

または:

from math import *

def sin_degrees(x):
    return sin(degrees(x))

14

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

に関してはimport *、Python 2は関数内でのスターのインポートを許可しました。例えば:

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

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


6
なぜその決定がなされたのですか?
2013年

1
私の推測では、その背後にあるアイデアは「明示的は暗黙的よりも優れている」ということです。PEP20から-Zen of Python。モジュールの前のドットは、相対/非相対リンクを明示的にするので、起こり得る名前の衝突を解決します。「読みやすさが重要です。」少し苦しみます。
Pafnucy

2
いいえ、実際、それは「反対」、「実用性は純粋さを上回る」という決定でした。関数内のローカル変数アクセスを最適化するために必要でした。 "import *"がないと、コンパイラーは常にコードを分析するだけで、どの変数がローカルで直接検索できるかを認識します。実際、関数はローカルストレージにdictを使用しませんが、変数が一意のインデックスを取得する最適化された配列を使用します。
Veky

11

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

from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle

14
import .brotherを使用すると、Python 3.5で無効な構文エラーが発生します。これは正常です?私はそれがあるディレクトリにinit .py を持っています
Frikster

1
import .brotherPython 2と3の両方の構文が無効です
ロドリゴE.プリンシペ

@ RodrigoE.Principeなどのようですimport ..uncle。修繕。ああ、私は何を考えていたのでしょう... Niと言う騎士に気を取られたのでしょう。
AkseliPalén18年

4

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.