ホームページ >バックエンド開発 >Python チュートリアル >Python が「ValueError: トップレベル パッケージを超えた相対インポートを試行しました」エラーをスローするのはなぜですか?

Python が「ValueError: トップレベル パッケージを超えた相対インポートを試行しました」エラーをスローするのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-21 11:26:10606ブラウズ

Why Does Python Throw a

相対インポートでの最上位パッケージを超えるエラー

最上位パッケージを超える相対インポートを試行すると、Python は「ValueError: 試行されました」をスローします最上位パッケージを超えた相対インポート」エラー。原因を理解するために、提供されたパッケージ構造を分析してみましょう。

package/
   __init__.py
   A/
      __init__.py
      foo.py
   test_A/
      __init__.py
      test.py

test.py では、..A import foo の行が A サブパッケージからインポートしようとしていますが、このサブパッケージには内部から直接アクセスできません。 test_A サブパッケージ。 Python では、現在のパッケージのスコープ内に相対インポートを維持する必要があります。

パッケージ フォルダー内から python -m test_A.test を実行すると、Python は test_A.test を現在のパッケージ内のモジュールとして解釈します。ただし、 -m フラグがモジュールを直接呼び出すため、パッケージはパッケージとは見なされなくなります。これにより、相対的なインポートが最上位のパッケージ (パッケージ) を超えて試行されるため、エラーが発生します。

対照的に、親フォルダーから python -m package.test_A.test を実行すると、Python はパッケージを認識します。パッケージとして提供され、そのスコープ内での相対インポートが可能になります。 A サブパッケージはパッケージ package 内でアクセスできるため、これは ..A import foo から正常に解決されます。

このエラーは、相対インポートが現在のパッケージのスコープ内に残るようにすることの重要性を強調しています。 -m フラグを使用してモジュールを直接呼び出す場合、Python は現在の作業ディレクトリをパッケージとして考慮しないため、発生したようなエラーが発生する可能性があります。

以上がPython が「ValueError: トップレベル パッケージを超えた相対インポートを試行しました」エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。