Modules & Packages


Modules & Packages


Modules


モジュール


変数、関数、クラスを含むファイル
モジュールを作成する理由は次のとおりです.
  • は、他のファイル
  • に使用することができる.
  • 完全なコードが大きすぎて1つのファイルに入れられない場合、
  • は複数のファイルに分けてクリーンアップできます.

    Making Module

    .pyファイルを作成すると、再利用する変数、関数、またはクラスをファイルに実装できます.
    # my_module.py
    
    my_module_var = 7
     
    def my_module_func():
        return "Hello!"
     
    class MyModuleClass:
        pass

    Import Module

    import module_name
    importキーワードとロードするモジュールのファイル名を入力します.
    (拡張子.pyを省略)
    モジュールを組み込むと、.(点)でモジュールの任意の変数/関数/クラスを実現できます.
    <모듈 이름>.<모듈에서 사용하길 원하는 변수/함수/클래스 이름>
    モジュールmy_moduleの関数my_module_funcを呼び出すには、次の操作を行います.
    # example
    my_module.my_module_func()

    なぜ前にモジュール名を付けるのですか?


    Pythonは、この関数を見つけるにはどのファイルが必要かを確認する必要があるからです.
    モジュールに名前を付けなければ、Pythonはモジュールのファイルを見ず、そのファイルで関数を検索したいだけなので、モジュール名を前に付けなければなりません.

    Import Module II

    from <모듈 이름> import <함수/변수/클래스1>, <함수/변수/클래스2>, ..., <함수/변수/클래스N>
    my_moduleモジュールでmy_module_func関数およびmy_module_var変数を使用する場合は、次の操作を行います.
    from my_module import my_module_func, my_module_var
     
    print(my_module_var)
    my_module_func()

    なぜimportを使うのですか?


    必要な関数や変数、クラスを直接呼び出すことができるので、モジュールが使用する部分を明確にするときに使用します.
    また、
    アスタリスクfrom.. import..を使用すると、モジュール内のすべての要素が*になります.

    なぜimportを推奨しないのですか?


    localscopeを持つ他の変数/関数/クラスと名前の競合が発生する可能性があります.名前の競合が発生すると、わかりにくい可能性があります.

    Import As

    from module_name import variable/function/class_name as new_name
    複数のモジュールをロードする必要があるが、2つのモジュールに*という関数が存在する場合、競合が発生する可能性があります.
    このとき、yo_maker()キーワードを使用して新しい名前を付け、ファイルで使用することができます.
    # example 
    
    from my_module  import my_func as f1
    from my_module2 import my_func as f2
    from my_module3 import function_with_name_too_long as f3
     
    f1()
    f2()
    f3()

    では、モジュール名にも新しい名前を付けることができますか?


    もちろん、import as名自体にも新しい名前を付けることができます.
    # example
    
    import my_module as m1
     
    m1.my_module_func()

    Packages


    ほうそう


    複数のファイルのコードを1つのモジュールから別のモジュールにロードして使用します.
    パッケージPythonファイルからなるディレクトリ(ディレクトリ)はパッケージ名となるパッケージとなる.

    Import Package


    dotシンボルを使用して、パッケージ内の所望のモジュールmoduleを使用する.
    # example
    
    import pkg.mod1
    from pkg.mod2 import func2
     
    pkg.mod1.func2()
    func2()

    Package Initialization


    importファイル


    Pythonは__init__.pyファイルでpackage初期設定を許可します.

    パッケージに__init__.pyファイルが含まれている場合、パッケージが__init__.pyの場合、importファイルのコードが自動的に実行されます.

    __init__.pyファイルの機能

  • 導入時に減少する経路の全長
  • .
  • パッケージにインポート可能な変数/関数/クラス制限は
  • です.
  • 他のパケットのインポート時に最初に実行する必要があるコード
  • __init__.pyでパスを減らすにはどうすればいいですか?


    __init__.pyファイルに一度インポートすることで、パスの長さを短縮できます.」
    「pkg」で「mod 1」の「func 2」関数を使用する場合は、次の操作を実行する必要があります.
    import pkg.mod1
     
    pkg.mod1.func2()
    長いんじゃないですか.__init__.py関数を使うたびにこのように書くのは面倒です.
    このとき、func2ファイルで関数のパスを減らすことができます.
    # __init__.py
    from .mod1 import func2
    # main.py
    from pkg import func2
     
    func2()

    __init__.allファイルでpy変数を指定する


    内部でしか使用できない関数がある場合は、packageの外部で__init.py__で使用されないようにimport変数を指定できます.
    パッケージによって__all__になる要素は、import変数によって定義されます.

    all変数の指定によるall要素の制限

    import変数のデフォルト値は、すべての関数/変数/クラスであるため、__all__変数を個別に定義して、インポート可能な要素を制限できます.

    all変数のlist性質

    __all__変数は文字列値を持つ要素のlistであるため、stringを使用してインポートする要素をlistに宣言できます.
    # __init__.py
    from .mod1 import func2
    from .mod2 import func3
     
    __all__ = ['func2', 'func3']
    # main.py
    from pkg import *
     
    func2()
    func3()
    func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.

    Using other one's Package

    __all__Pythonのpackage managerツールpip install pkg_name を使用すると、他の人のpackageをpipに設定できます.
    たとえば、Djangoをインストールするには、端末に次のように入力します.
    pip install Django 

    Take Away


    難しい難しい難しい!


    モジュールを理解するにはどうすればいいのでしょうか...コースに入ると、確かに難しくなってきました.
    パッケージにもimportファイルと__init__.py変数が記載されていますが、まだ実際に使用されていないので理解しにくいと思います.