[TIL] Python: Modules


1. sys


1-1. Understanding sys


Python documentation根拠:
This module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter. It is always available.
SysモジュールはPython Interpreterが提供するシステムに専用の関数または変数を提供する.しかもいつも使える.つまり、内蔵モジュールです.
そのため,Pythonからsysモジュールを導入する際にも多くのパスがある.
import sys 	#from ??? 필요 없다 !

1-2. sys.modules vs sys.path

  • sys.modulesインポートしたモジュールとパッケージを保存した辞書です.そのため、一度に導入したモジュールやパッケージには、Pythonを再検索する必要がない機能があります.ただし、そのため新しいimportモジュールは見つかりません.
  • sys.pathモジュールのすべての場所が文字列で格納されているリストです.Pythonはリスト内の各パスを1つずつチェックし、インポートするパッケージがパスにあるかどうかを決定します.
  • 2. Absolute path vs Relative path


    次のディレクトリがあるとします.
    
    └── project
        ├── package1
        │   ├── module1.py
        │   └── module2.py      	#contains function1
        └── package2     
            ├── __init__.py     	#contains class1
            ├── module3.py
            ├── module4.py
            └── subpackage1
                └── module5.py 	#contains function2

    2-1. Absolute path


    Absolute pathは絶対パスです.つまり、プロジェクトの最上位ディレクトリに基づいてパスを決定します.
    上記のディレクトリでfunction 1を絶対にインポートする場合は、次の手順に従います.
    from package1.module2 import function1
    
  • 長所:確実で簡単今の位置が変わっても同じです.
  • 短所:複雑なディレクトリでは、長すぎると面倒になります.
  • 欠点などは以下の例で確認することができる.
    △本当に長いですね.一本の糸も入らずに切られました.
    from package1.subpackage2.subpackage3.subpackage4.module5 
    import function6
    このような状況を解決するために、相対的な経路が存在します!

    2-2. Relative path


    Relative pathは相対パスです.すなわち,importの位置に基づいて経路を定義する.したがって、相対パスは、local packageに他のlocal packageをインポートするために使用される.
  • 利点:現在位置に応じて簡単に記述できる.
  • 短所:限定(feat.mainmodule)
  • 欠点はWecode assignment 1.で見つけることができます:)
    これらは、相対importの例です.
    from .some_module import some_class
    from ..some_package import some_function
    from . import some_class
    .:1つのポイントは、読み込まれたモジュールまたはパッケージが現在位置と同じディレクトリにあることを示します.(相対位置が同じと理解すれば便利です)..:現在位置の真上にあるディレクトリ(parent directory)を2点表示します.
    では3つのポイントがgrandparentディレクトリです.
    これでポイントを増やすことができます.

    WeCode assignment


    1.リレーションシップインポートが使用できない場合:mainmodule



    add and multiplyに乗算モジュールの乗算関数をインポートするために、main.pyに次のコードが記述されています.
    # 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))
    エラーメッセージは次のとおりです.
    ImportError: attempted relative import with no known parent package
    すなわち,top−levelパケットを超えた相対インポートを試みた.
    Pythonホームページ根拠:
    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.
    つまり.
    相対パスを使用してインポートしようとすると、現在のモジュールの名前に基づいている必要があります.mainモジュールの名前は常に__main__なので、絶対パスを使用する必要があります.
    上の問題から、なぜエラーが発生したのかがわかります.
    計算機でmainします.pyは計算機パッケージに属するファイルではありません.旧道pyが所属している場所は__main__したがって、絶対パスを使用する必要があります.

    2. add_and_multiply.pyからインポート


    Multiplyをインポートするには、両方のパスを使用しました.
    1) absolute pathfrom calculator.multiplication import multiply2) relative pathfrom .multiplication import multiply結果は同じで、両方のルートでいいです.
    mainmoduleとadd and multiplyの違いは:
    1.mainは同じパケット内にないため、相対パスは使用できません.
    add and multiplyは同じパッケージにあるため、絶対パス、相対パスが使用できます.