How import statement finds modules and packages
3766 ワード
1. sys.モジュールとシステム。パスの違いを述べてください。
sys.modules
sys.path
2.sysもインポートするモジュールです。Pythonはsysモジュールをどのように位置決めしますか?
- 'sys':<module'sys'(built-in)>
3.Absolute pathと相対pathの違いを述べてください。
Absolute path
absolute pathとは,モジュールとパケットの開始から終了まで省略や収縮がない明確な経路を指す.どこで使っても同じで、使うときに紛らわないメリットがあります.
# pkg2/module5.py
# relative path를 적용하기전
from pkg1 import module1
from pkg1.module2 import func3
from pkg2 import module3
from pkg2.pkg4.module6 import func10
パスの開始点は、sys.pathに自動的に登録されたモジュールとそのパッケージが存在するcurrent directoryであるため、main.どこで使ってもpyではなく同じ方法で使えます.Relative path
# pkg2/module5.py
# relative path를 적용하기 전
from pkg1.module2 import func3
from pkg2 import module3
from pkg2.pkg4.module6 import func10
相対パスは、最上位パスではなく現在の自分が属するパスに基づいて定義されます.主にlocalpackageで他のlocalpackageを参照するために使用されます.# pkg2/module5.py
# relative path를 적용한 후
from ..module2 import func3
from . import module3
from .pkg4.module6 import func10
# pkg4/module6.py
from ..module5 import func_12
absolute pathと比較して簡潔な利点がありますが、プロジェクトの拡大と複雑さが高まるにつれて、ファイルの場所が変更された場合、pathを再設定する必要があります.4.計算パッケージの作成
main.py
# absoulte path
# from calculator.add_and_multiply import add_and_multiply
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1, 2))
__init__.py
빈 파일이지만 package임을 알려주는 역할을 함.
add_and_multiply.py
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
multiplication.py
def multiply(a,b):
return(a*b)
5. main.pyがadd and multiplyを相対パスとしてインポートしたときに発生したエラーを確認します。以下のPythonの公式ドキュメントを参照し、メインモジュールにパッケージ内のモジュールをインポートする方法を記録してください。
main.pyからadd and multiplyを相対パスとしてインポートすると、次のエラーが発生します.
ImportError: attempted relative import with no known parent package
エラーを解決するために、直接実行するモジュール内のimportはabsolute pathで行うことができます.6. add_and_multiply.pyに複数の関数の絶対パスと相対パスをそれぞれインポートし、メインモジュールとの違いを考慮して結果を出力します。
absolute pathもrelative pathも実行せず、エラーが発生しました
絶対パスはパケットを認識できません.相対パスには既知の親パケットはありません.
相対パスimportを実行するエラーを出力します.
mainモジュールとの違いは、name変数をチェックするための条件文があることです.
mainモジュールを実行すると、name変数の条件文がこの条件を満たしprint関数を実行します.
add_and_multiply.pyモジュールの絶対パスと相対パスは正常に動作します.
7. __init__.pyファイルの役割も整理してブログを書いてください。
__init__.py
ファイルの役割は、ディレクトリがパッケージの一部であることをユーザに伝えることである.でもpython第3版からは
__init__.py
ファイルがなくてもパッケージとして扱われている.ただし、サブバージョン互換性のために
__init__.py
ファイルを生成することは安全な方法です.Pythonがpackageを最初にインポートすると、ディレクトリの
__init__.py
のすべてのコードが自動的に実行され、packageのファイルを初期化するために必要な状態になります.ファイル内でallというリストを使用してimport*を設定するときにロードするモジュールを使用して、必要なモジュールのみをロードできます.
Reference
この問題について(How import statement finds modules and packages), 我々は、より多くの情報をここで見つけました https://velog.io/@tngusl5/How-import-statement-finds-modules-and-packagesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol