Pythonモジュール化


Pythonのパッケージとモジュール
moduleタイプ
Pythonでは、importキーワードを使用してパッケージまたはモジュールをインポートします.モジュールはmoduleというタイプで、モジュールタイプのみがimportインポートを直接使用できます.まず、パッケージプロセスです.
print('   :', dir())   #        
import os
print('   :', dir())   #        

-----    -----#  
   :       "os"
   :   "os"

これは、グローバル変数にos識別子が表示されていることを示しています.これは、os.chdir()などのos識別子を使用してメンバーにアクセスできる理由でもあります.os識別子のタイプとosが指すこのオブジェクトをもう一度見てみましょう.
print(type(os))
print(type(os.path))
print(global()["os"])  #       ,  os    

-----    -----



以上の結果は、osおよびos.pathmoduleタイプであることを示しており、osimportを使用して導入できる理由でもある.インポートできるのはmoduleタイプのみです.同理os.pathは直接導入されてもよい.
print(dir())
import os.path
print(dir())
-----    -----#  
   :       "os"    "os.path"
   :   "os",    "os.path"

os.pathは合法的な識別子(文字、下線、数字)ではないので、このos.pathオブジェクトは変数に受け入れられませんが、後でこのos.pathオブジェクトにアクセスする必要があるので、pythonはos変数をosモジュールに残しています.os.pathでアクセスできます.もちろん別名を使うのですパスは受信できます.
import os.path as osp
osp.dirname(".")           # osp     os.path    .         dirname(".")                     
print(type(osp))           # 
print(globals()["osp"])    # 
ospはosを直接指していますpathモジュールは、ospにアクセスでき、os変数も意味がないので、このときのグローバル変数にはosというグローバル変数は常に存在しませんが、osというモジュールはimportによってメモリ空間にロードされています.ただし、このモジュールには対応する表示子が対応していない.
モジュールの検索順序
モジュールのすべての順序がsys.pathに記録されており、プログラム実行時にどのクラスがインポートされたか、インポートされたすべてのクラスがsys.modulesに緩和され、呼び出されて表示されます.
import sys
print(*sys.path, "
", *sys.modules, sep="
") -------- ------ ''' D:\ \ \pycharm \myproject # D:\ \ \pycharm # pycharm E:\Python\python36.zip # Python , zip,egg E:\Python\DLLs E:\Python\lib E:\Python E:\Python\lib\site-packages ''' {'builtins': , # 'sys': , 'os': , '_frozen_importlib': , 'myproject': }
.eggファイルは、setuptoolsライブラリによって作成されたパッケージであり、サードパーティライブラリでよく使用されるフォーマットであり、メタデータ情報が追加されたzipファイルである.
fromインポートの使用from ... import ...は、1つのモジュールからオブジェクトをインポートする、このモジュールは1つである可能性がある.pyファイルは、パッケージ(ディレクトリ)であってもよく、インポートされたオブジェクトは、パッケージまたはモジュールの下の関数、クラス、モジュールなどのグローバル変数識別子であってもよく、インポート後、モジュール接頭辞を付けることなくimport後の元の変数識別子を直接使用してアクセスできます.fromおよびimport後に指定された内容は、メモリにロードされます.
from os import path          #  os    path  ,     path        
from os.path import dirname  #  os.path      dirname  ,      dirname          。

from os.path import *        #    os.path          (      ),                   

第3の方法では、パケット内のグローバル変数がパケット内にインポートされたグローバル変数によって上書きされやすくなります.2つのパケットの変数が重複しないことを明確に知らない限り、できるだけ使用しません.from ... import *を使用してデフォルトでインポートされるのは、公開変数(非_または__ヘッダの変数)です.非公開変数のインポートには手動でアクセスするか、allプロパティに追加して*インポートを使用する必要があります.
from os import _abc, __abc   #        ,*         

__all__
インポートされたモジュールでは、__all__プロパティを追加して、モジュールのデフォルトのすべてのエクスポート可能なモジュールを指定できます.from ...import *に合わせて使用します.__all__プロパティは、グローバル空間内のグローバル変数名に対応するか、パケットの下のサブパケット名に対応する必要がある文字列のリストです.
__all__ = ["x", "y", "_z"]

x = 1
y = 2
z = 3
_z = 4 

このパケットが他のパケット使用*によって導入されると,__all__に対応するx,y,_z変数が導出され,我々の手動制御変数の導出が実現される.
パッケージのインポート時に属性が優先され、この属性がなければこのモジュールがあるかどうかを判断します.したがって、プロパティ名とモジュール名が競合すると、モジュールはエクスポートされません.
パッケージ
Pythonのパッケージはフォルダで、フォルダの下に各モジュールが置かれています.pyファイルまたはサブパッケージで、管理が便利です.パッケージにもコードを書くことができます.これは、このパッケージの下にある__init__.pyファイルが必要です.このファイルはこのパッケージに属しています.私たちが1つのパッケージをインポートするだけで、このパッケージの下にある__init__.pyファイルのグローバル変数で指定された内容をインポートします.このパッケージのサブモジュールは自動的にインポートされません.
パッケージファイルとモジュールファイル
パッケージモジュールのコードは、パッケージ下の__init__.pyファイルに管理され、パッケージに__init__ファイルがなくてもインポートできますが、何もインポートされていません.この場合、このパッケージ名でこのパッケージ下のモジュールファイルを探すしかありません.from ... inport ...を使用して、サブモジュール内のコンテンツをインポートします.
パケットは少し特殊なモジュールオブジェクトであり、パケットの属性は['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']であり、__package__の属性に基づいてパケットであるか否かを判断することができ、この属性はNoneであるか、存在しないかはパケットではないことを示す.
パッケージの下のモジュールはこのパッケージのサブモジュールであり、このモジュールがインポートされたことを前提としてpackage.mod_nameでアクセスできます.from package import mol_を使用することができます.nameまたはimport package.mol_nameはインポートを行い、2つのインポート効果は同じですが、インポート空間の変数名が異なり、使用形式が異なります.ただし、import packageのみがサブパッケージを自動的にインポートできず、package.mul_nameはアクセスできません.
相対インポートと絶対インポート
importインポートモジュールシーケンスを使用してsys.moduleに記録され、デフォルトでは実行ファイルの現在のディレクトリから優先され、Pythonインストールファイルのライブラリに再検索できません.これは絶対パスインポートです.
相対インポートは通常、パケット内の各モジュールを容易に関連付けるために1つのパケットで使用されます.この関連付けは、パケット内のファイルの相対的な位置によってのみ制約されますが、パケットについては内部のファイル関係に干渉しません.相対インポートの原則はファイルシステムの使用の原則に従い、パケット__init__.pyファイルであっても、このパケットの下のサブファイルに属し、このパケットの下の他のサブファイルに等しい.
アイコン

.
.m
現在のフォルダのmモジュール
..
..m
上位ファイルのmモジュール
...
...m
上位レベルのファイルのmモジュール
from .m import a     #           m      a
from ..m import a    #              m      a
from .m.m1 import a  #           m    m1     a

以上のインポート方式はパッケージでのみ使用できます.これらのファイルは、インポートされたパスに対してプライマリ・パッケージが置かれている現在のディレクトリに関連することはできません.プライマリ・モジュールとして直接実行することはできません.パッケージ内部の関係の確立方式であり、直接実行するとエラーが発生します.
ネーミングスペース
モジュールをインポートすると、このモジュールにアクセスできるのは、現在の役割ドメインの内部にモジュール名と同じ名前のグローバル変数が作成されているため、このグローバル変数を使用してモジュールにアクセスできます.モジュールを1つ使用できるかどうかは、2つの条件が必要です.
  • 1、モジュールがメモリにロードされる
  • .
  • 2は、モジュールオブジェクトに直接関連する識別子を見つけることができ、または他の識別子のメンバーアクセスによってモジュールオブジェクトにアクセスすることができる.

  • このネーミングスペースで作成される識別子は、異なるインポートファイル方式で異なります.
    import os        #    os  (os  __init__.py    ),  os   
    import os as o   #    os  ,  o   
    
    import os.path   #     os   os.path,    os   ,  os  。os.path   
    import os.path as osp  #     os   os.path,    osp   ,  os.path  ,os     ,      ,    
    
    from os import path   #     os   os.path,   path   ,  os.path。os    ,    
    from os import *      #     os       ,   __all__  ,       ,     *       ,    os
    
    form .m import a   #      , m   a    ,m       ,    dir       ,a      

    カスタムモジュール
    ≪モジュールネーミング仕様|Module Naming Specification|emdw≫:モジュールをインポートするときに、モジュール名が識別子として使用されます.これにより、モジュール名が識別子のネーミング仕様を満たす必要があります.これにより、インポートできます.また、モジュールのグループは小文字で、下線で分割することができます.
    モジュールの繰り返しインポート
    モジュールが1回ロードされると、このモジュールオブジェクトがメモリにキャッシュされ、このモジュールの識別情報はsys.modulesにキャッシュされる.モジュールをインポートするときは、まずsys.modulesからモジュールがロードされたかどうかをクエリーし、すでに存在する場合はファイルから読み取るのではなく、メモリに存在するこのモジュールオブジェクトを直接使用します.そうしないと、importはモジュールのファイルを検索し、コンパイルし、このモジュールを実行し、大きなメモリをロードします.
    キャッシュモジュールはsysに保存する.moduleには、解釈器の実行に必要なモジュールも含まれています.カスタムモジュールa/b/cパスは、aモジュールimport aのみをインポートし、a.bを直接使用するのはリスクがあり、このモジュールはロードされず、importキーワードを使用する場合にのみ、解釈器は自動的にロードされず、モジュールはロードされません.
    モジュール運転
    私たちが実行するとpyファイル、このとき解釈器は実行を開始するが、このファイルを実行する前に、解釈器はioなどのパケットをインポートするなど、他の作業が必要である.pyファイルは、この組み込み関数を使用する可能性があるため、メモリまたはbuild-inに読み込まれます.他にも多くの準備プロセスがあります.この仕事が終わったら、私たち自身を実行します.pyファイル.そしてこれはpyファイルも__main__パッケージと命名されます.このモジュール名を表示すると__main__と表示されます
    print(__name__)       # __main__

    解釈器が実行するコードに加えて、このモジュールは最外層のコードブロックとして機能し、このモジュールの終了はスレッドの終了を表す.トップレベルコードとも呼ばれます.最上位のコードパッケージの「name」プロパティは__main__で、残りのモジュールの__name__プロパティはモジュール名です.テストコードは通常このように書かれています
    if __name__ == "__main__":
        # test code   

    このモジュールが直接実行される場合にのみ、ifのテストコードが実行されます.