How import statement finds modules and packages


1. sys.モジュールとシステム。パスの違いを述べてください。

sys.modules
  • Python最初のアクセスモジュールまたはパッケージ
  • ディック郡構造
  • インポートしたモジュールとパッケージ(再検索不要)
  • を保存sys.path
  • モジュールとパッケージが1、2個見つかり、最後にsysです.path
  • が見つかりました
  • リスト構造(文字列要素)
  • 初期リスト要素から最終検索
  • まで
  • Python付属の内蔵モジュール
  • sys.pathでモジュールが見つからない場合は、モジュールNotFoundError
  • に戻る

    2.sysもインポートするモジュールです。Pythonはsysモジュールをどのように位置決めしますか?

  • Pythonは、スクリプトの実行時にPYTHONPATH、優先パラメータ、変数、および上記モジュール
  • を順次実行する.
  • これら3 DDパーティションは、インストール時に自動的に絶対パス(「STRINGタイプ」)を設定し、検索しやすい
  • 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*を設定するときにロードするモジュールを使用して、必要なモジュールのみをロードできます.