Module & Packages


モジュール


モジュールとは


Pythonでは、moduleは変数、関数、クラスなどを集めたファイルです.

モジュールを使用する理由


ファイルが大きすぎて、別のファイルで繰り返し使用できず、コード全体が1つのファイルに置かれている場合は、複数のファイルに分けてクリーンアップおよび管理できます.

モジュールの使用

  • モジュールの作成-ファイルの作成後、再利用する関数、クラス、または変数を実装します.
  • ## my_module.py
    def getSum(a,b):
    	return a+b
    
    def getDiff(a,b):
    	if a > b:
        		return a-b
        	else:
            	return b-a
    2-1. モジュールの読み込みと使用-importキーのみで読み込み
    import
    ## main.py
    import my_module
    
    x = 2
    y = 3
    
    print(my_module.getSum(x,y)) # => 5
    print(my_module.getDiff(x,y)) # => 1
    2-2. from importキーワードの使用
    from import , , ...
    ## main.py
    from my_module import getSum, getDiff
    
    print(getSum(2,3)) # => 5
    print(getDiff(5,2)) # => 3
    fromimport*を使用すると、モジュール内のすべての要素がすぐにインポートされます.
    ## main.py
    from my_module import *
    
    print(getSum(2,3)) # => 5
    print(getDiff(5,2)) # => 3
    2-3. import as-モジュールまたはモジュールにインポートする要素に新しい名前を付けることができます.

    main.py

    ## main.py
    import my_module as mm
    
    print(mm.getSum(2,3)) # => 5
    print(mm.getDiff(5,2)) # => 3
    ## main.py
    from my_module import getSum as gs
    from my_module import getDiff as gd
    
    print(mm.gs(2,3)) # => 5
    print(mm.gd(5,2)) # => 3

    ほうそう


    パッケージとは?


    モジュールと同様に、これは他のファイルからロードされて使用される概念であり、モジュールよりも大きく複雑なコードであることを区別します.モジュールは簡単なPythonファイルですが、パッケージはPythonファイルからなるディレクトリです.
    上記の構成が画像のようなものであると仮定すると、以下のように使用することができる.
    import pkg.mod1
    from pkg.mod2 import func2
    
    pkg.mod1.func2()
    func2()
  • Pythonではpipを使って他の人のパッケージをダウンロードして使用することができます.
    e.g.) pip install Django
  • Package Initialization


    パッケージのインポート時に初期設定が必要な場合があります.
    Pythonはinitです.パッケージの初期設定はpyファイルで実現します.

    パッケージ内でinit.pyファイルがある場合は、パッケージのインポート時にinitします.pyファイルのコードが自動的に実行されます.
    __intit__.pyでできること
  • 導入時に減少する経路の全長
  • .
  • パッケージにインポート可能な変数/関数/クラス制限
  • importが最初に実行する必要があるコード
  • を設定します.
  • には、空のファイルであってもパッケージであることをプログラムに伝える役割もあります.

    パスの全長を小さくする


    __init__.まずpyファイルをインポートします.
    __init__.pyファイルで関数のパスを減らすことができます.
    #__init__.py
    from .mod1 import func2
    #main.py
    from pkg import func2 #모듈을 언급하지 않아도 됨
    
    func2()

    制限変数/関数/クラス


    モジュール内のすべての関数は外部に露出できない可能性があります.パッケージの外部でこれらの関数をインポートおよび使用しないようにall変数を指定することもできます.
    パッケージでインポートできるすべての要素はall変数で定義されます.
    また、all変数のデフォルト値は、すべての関数/変数/クラスです.
    したがって、all変数を個別に定義して、インポート可能な要素を制限することができます.
    all変数はstring値要素を持つlist(list of strings)である.
    したがってstringを使用して、インポートする要素をlistに宣言できます.
    # __init__.py
    from .mod1 import func2
    from .mod2 import func3
    
    __all__ = ['func2', 'func3']
    # main.py
    from pkg import func2
    from pkg import func3
    
    func2()
    func3()
    func4() ## <=Error. func4 함수는 __all__에 정의되지 않았음.

    import statement


    モジュールとパッケージについて簡単に説明します.では、モジュールとパッケージをロードするときに使用する「import」が、モジュールとパッケージをどのように検索するかについて説明します.

    Import Searchシーケンス


    たとえば、pkgというパッケージがあるとします.このパッケージを使用するには、次のようにインポートする必要があります.
    import pkg
    コードのみを表示する場合、「pkg」はモジュール(Pythonファイル)またはモジュールを含むディレクトリ、または両方のいずれかです.したがって、Pythonは、インポートのためにファイルまたはディレクトリのパスを見つけることができる必要があります.
    Pythonがモジュールまたはパッケージを検索するときの検索順序は以下の通りです.
       1. sys.modules
       2. built-in modules
       3. sys.path

    sys.modules


    パイソンがモジュールやpackageを見つけるために最初に確認した場所です.
    sys.モジュールは辞書で、インポートしたモジュールとパッケージが格納されています.
    つまり、一度に導入したモジュールやパッケージには、Pythonを再検索する必要がない機能があります.
    新しくインポートしたモジュールはsysです.モジュールに見つかりません.

    built-in modules


    これらはPythonが提供するPython公式ライブラリです.
    Built-inモジュールはすでにPythonに含まれているため、Pythonは簡単に見つけることができます.

    sys.path


    sys.pathのデフォルトはlistで、string要素が含まれています.各string要素はパスを表し、以下に示す.
    ['/run_dir', '/usr/local/lib/python38.zip',
    '/usr/local/lib/python3.8',
    '/usr/local/lib/python3.8/lib-dynload',
    '/home/runner/.local/share/virtualenvs/python3/lib/python3.8/site-packages']
    これらのリストの各パスを確認し、これらのパスにインポートするパッケージがこれらのパスにあるかどうかを確認します.

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


    sys.modulesには、インポートしたモジュールまたはパッケージ、sysが表示されます.pathには、モジュールまたはパケットの検索時に検索されるパスが表示されます.

    Sysもインポートが必要なモジュールですが、Pythonはsysのモジュールをどのように位置決めしますか?


    sys.モジュールを印刷するとsysというモジュールが内蔵モジュールであることがわかります.

    Absolute Path & Relative Path


    Pythonの内蔵モジュールとpipでインストールされる外部モジュールとパッケージは、通常、インポートにとって大きな問題ではありません.Built-inモジュールはもちろんよく探していますが、pipでインストールされた外務モジュールもsite-packagesというディレクトリに自動的にインストールされます.このsite-packagesはsysです.パスは既に含まれているので、検索に問題はありません.
    問題は直接開発したローカルパッケージです.自分が開発したlocal packageをインポートする場合は、packageの場所に基づいてインポートパスを正しく宣言します.Local packageをインポートするパスには、絶対パスと相対パスがあります.

    絶対パス


    インポートしたファイルまたはパスにかかわらず、パスは常に同じです.
    すべてのパスの開始点は、プロジェクトの最上位ディレクトリから始まります.
    プロジェクトでは、どのファイル、どの場所からインポートしてもパスは常に固定されているため、プロジェクトのトップディレクトリに対してパスは絶対パスと呼ばれます.
    一般的にlocalpackageをインポートするときにabsolute pathを使用できます.しかし、absolute pathを使用する欠点は、経路が長くなる可能性があることです.これらの欠点を補うために、相対パスを使用することができる.

    相対パス(Relative Path)


    Relative pathはabsolute pathとは異なり、プロジェクトのトップディレクトリではなく、インポートされた場所に基づいて定義されます.したがって、通常、相対パスを使用してlocalパケットから他のlocalパケットをインポートします.
    Relative pathの利点は、宣言するパスの長さを減らすことですが、混同しやすく、ファイルの場所が変更された場合、パスの場所も変更する必要があります.したがって,一般的には絶対pathを用いることを推奨する.

    注意事項


    正式なドキュメントを参照すると、相対パスを使用しないでくださいというメッセージが表示されます.
    本文
    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であるため、Pythonアプリケーションのメインモジュールに使用するモジュールは常に絶対パスを使用する必要があります.
    コンテンツ上、Pythonがプロジェクトにパスを設定する場合は、プライマリ・ファイルに基づいているため、プライマリ・モジュールに絶対パスを指定する必要がある場合があります.(もちろん、大脳皮質)