1. ホーム
  2. python

[解決済み] import文の変更点 python3

2022-04-23 18:23:40

質問

以下の文章が理解できません。 pep-0404

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

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

どのように解決するのですか?

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

例えば次のようなツリーを考えてみましょう。

mypkg
├── base.py
└── derived.py

さて、あなたの derived.py には、以下のものが必要です。 base.py . Python 2 では、次のようにすることができます ( derived.py ):

from base import BaseThing

Python 3 では、'relative' と 'absolute' のどちらが必要かが明示されていないため、サポートされなくなりました。 base . 言い換えれば、もしPythonのパッケージで base がインストールされている場合、間違ったものが表示されます。

代わりに、それはあなたが 明示的なインポート これは、モジュールの場所をパスライクに明示的に指定するものです。あなたの derived.py は次のようになります。

from .base import BaseThing

先頭の . は、「インポート base from module directory' ;言い換えれば .base./base.py .

同様に、そこには .. のようなディレクトリ階層を上がる接頭辞があります。 ../ (ただし ..mod へのマッピングは ../mod.py を含む)、そして ... で、2つ上の階層に行く( ../../mod.py というように。

ただし、上記の相対パスは、現在のモジュール( derived.py ) に存在する。 ではなく は、現在の作業ディレクトリです。


ブレンバーン は、すでにスターインポートのケースを説明しています。念のため、私も同じことを言わなければならないでしょう;)。

例えば、いくつかの 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))