[TIL. 28] Python- Module2


1. sys.モジュールとシステム。pathの違い

  • sys.modules
    1)モジュールとパッケージの最初の検索場所
    2)簡易辞書からなる
    3)インポートしたモジュールとパッケージを保存します.
    4)新しくインポートしたモジュールが見つかりません.
  • sys.path
    1)文字列を持つリスト
    2) sys.moduleとbuild-inモジュールをチェックしますが、ない場合は最後の順序で検索します.
    3)リストの要素から最後まで検索します.
    4)最初のリスト要素から最後まで検索します.
  • 2.sysもインポートするモジュールです。Pythonはsysモジュールの位置をどのように見つけますか?

    import sys
    print(sys)
    
    # <module 'sys' (built-in)>
    sysをインポートすると、bullit-inモジュールであることを直接確認できます.
    bullit-inモジュールはすでにPythonに含まれているので、Pythonは簡単に見つけることができます.

    3.Absolute pathと相対pathの違いについて述べる。

  • absolute path
    インポートされたファイルまたはパスにかかわらず、パスは常に同じであるため、絶対パスです.

  • ファイルのディレクトリがこのように組織されていると仮定します.
    from package1 import module1				# module1의 바로 상위 파일은 package1 에서 받아온다.
    from package1.module2 import function1		# package1에 있는 module1안에 있는 function1 을 받아온다. 
    from package2 import class1
    from package2.subpackage1.module5 import function2
    💡 プロジェクトの最上位ディレクトリに基づいてパスを決定します.したがって,経路は常に同じであるため,絶対経路と呼ぶ.
  • 相対パス(相対パス)
    importの位置に基づいてパスを決定します.したがって、local package内に他のlocal packageをインポートする場合に使用します.

  • 上図では、現在の位置がmodule 3であり、class 1とfunction 2を使用したい場合は
    # package2/module3.py
    
    from . import class1
    from .subpackage1.module5 import function2
    このように、私が今いる場所に基づいてファイルを検索します.
    このときは、importを宣言するファイルの現在の場所です.現在の場所から親ディレクトリへのパス
    相対パスはパスの長さを短縮できますが、混同やファイルの場所の変更の場合、パスの場所も変更する必要があるため、通常は絶対パスが使用されます.

    4.計算パッケージの作成



    (init.pyの役割はディレクトリがパッケージであることを知らせることです)
    ファイルパスは上と同じで、main.pyから相対パスにadd and multiplyをインポートする場合
    from .calculator.add_and_multiply import add_and_multiply
    
        # from .calculator.add_and_multiply import add_and_multiply
    # ImportError: attempted relative import with no known parent package
    次のエラーが発生しました.
    エラーメッセージは、相対パスに親パケットがないことを示します.
    Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.
    💡 Pythonの公式ドキュメントでは、mainモジュールの名前は常に__main__なので、Pythonのメインモジュールとして絶対パスを常に使用する必要があります.
    from calculator.add_and_multiply import add_and_multiply
    
    # 5
    このように、絶対パスに変換するとmoduleをうまく読み込んで使用できます.

    4-1. add_and_multiply.pyに複数の関数の絶対パスと相対パスをそれぞれインポートし、メインモジュールとの違いを考慮して結果を出力します。


    add_and_multiply.pyでは、絶対パスと相対パスの両方をインポートしても問題ありません.
    理由は.
    main.pyでは、 __name__ == '__main__'は常に絶対パスとして使用する必要がありますが、パッケージファイルのファイルでは、モジュールの名前は__name__に設定されていないので、相対パスでも絶対パスでも使用できます.

    5. init.pyファイルの役割

  • の役割は、ディレクトリがパッケージの一部であることを示すことです.(パッケージであることはファイルのみでわかります.)
  • 1.インポート時のパスの全長を減らす
    import pkg.mod1
    
    pkg.mod1.func2()
    現在,pkgではmod 1,func 2をimport関数の基本手法として用いており,func 2関数を呼び出すたびにすべてのパスを入力する必要があるため,面倒である.しかし、関数名を直接呼び出すことができればinitは便利です.pyで関数のパスを減らすことができます.
    1) init.まずpyファイルにインポートする関数または変数を書きます.
    # __init__.py
    from .mod1 import func2
    2)必要なファイルから...import ... 形式で使用できます.
    # main.py
    from pkg import func2
    
    func2()
    2.変数、関数、クラスの制限
    モジュール内のすべての関数が外部に露出することを防止し、内部でのみ使用できます.
    all変数で定義します.
    all変数のdefault値はすべての関数、変数、クラスであるため、all変数を個別に定義してインポート可能な要素を制限できます.
    # __init__.py
    from .mod1 import func2
    from .mod2 import func3
    
    __all__ = ['func2', 'func3']
    initファイルに露出したくない関数を定義する
    # main.py
    from pkg import *
    
    func2()
    func3()
    func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.
    all変数はstring値を持つlistであるため、stringを使用してインポートする要素をlistに宣言できます.