Pythonモジュール化
Pythonのパッケージとモジュール
moduleタイプ
Pythonでは、importキーワードを使用してパッケージまたはモジュールをインポートします.モジュールは
これは、グローバル変数に
以上の結果は、
os.pathは合法的な識別子(文字、下線、数字)ではないので、この
モジュールの検索順序
モジュールのすべての順序が
fromインポートの使用
第3の方法では、パケット内のグローバル変数がパケット内にインポートされたグローバル変数によって上書きされやすくなります.2つのパケットの変数が重複しないことを明確に知らない限り、できるだけ使用しません.
__all__
インポートされたモジュールでは、
このパケットが他のパケット使用*によって導入されると,
パッケージのインポート時に属性が優先され、この属性がなければこのモジュールがあるかどうかを判断します.したがって、プロパティ名とモジュール名が競合すると、モジュールはエクスポートされません.
パッケージ
Pythonのパッケージはフォルダで、フォルダの下に各モジュールが置かれています.pyファイルまたはサブパッケージで、管理が便利です.パッケージにもコードを書くことができます.これは、このパッケージの下にある
パッケージファイルとモジュールファイル
パッケージモジュールのコードは、パッケージ下の
パケットは少し特殊なモジュールオブジェクトであり、パケットの属性は
パッケージの下のモジュールはこのパッケージのサブモジュールであり、このモジュールがインポートされたことを前提として
相対インポートと絶対インポート
importインポートモジュールシーケンスを使用して
相対インポートは通常、パケット内の各モジュールを容易に関連付けるために1つのパケットで使用されます.この関連付けは、パケット内のファイルの相対的な位置によってのみ制約されますが、パケットについては内部のファイル関係に干渉しません.相対インポートの原則はファイルシステムの使用の原則に従い、パケット
アイコン
例
.
.m
現在のフォルダのmモジュール
..
..m
上位ファイルのmモジュール
...
...m
上位レベルのファイルのmモジュール
以上のインポート方式はパッケージでのみ使用できます.これらのファイルは、インポートされたパスに対してプライマリ・パッケージが置かれている現在のディレクトリに関連することはできません.プライマリ・モジュールとして直接実行することはできません.パッケージ内部の関係の確立方式であり、直接実行するとエラーが発生します.
ネーミングスペース
モジュールをインポートすると、このモジュールにアクセスできるのは、現在の役割ドメインの内部にモジュール名と同じ名前のグローバル変数が作成されているため、このグローバル変数を使用してモジュールにアクセスできます.モジュールを1つ使用できるかどうかは、2つの条件が必要です.1、モジュールがメモリにロードされる .2は、モジュールオブジェクトに直接関連する識別子を見つけることができ、または他の識別子のメンバーアクセスによってモジュールオブジェクトにアクセスすることができる.
このネーミングスペースで作成される識別子は、異なるインポートファイル方式で異なります.
カスタムモジュール
≪モジュールネーミング仕様|Module Naming Specification|emdw≫:モジュールをインポートするときに、モジュール名が識別子として使用されます.これにより、モジュール名が識別子のネーミング仕様を満たす必要があります.これにより、インポートできます.また、モジュールのグループは小文字で、下線で分割することができます.
モジュールの繰り返しインポート
モジュールが1回ロードされると、このモジュールオブジェクトがメモリにキャッシュされ、このモジュールの識別情報は
キャッシュモジュールはsysに保存する.moduleには、解釈器の実行に必要なモジュールも含まれています.カスタムモジュール
モジュール運転
私たちが実行するとpyファイル、このとき解釈器は実行を開始するが、このファイルを実行する前に、解釈器は
解釈器が実行するコードに加えて、このモジュールは最外層のコードブロックとして機能し、このモジュールの終了はスレッドの終了を表す.トップレベルコードとも呼ばれます.最上位のコードパッケージの「name」プロパティは
このモジュールが直接実行される場合にのみ、
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.path
がmodule
タイプであることを示しており、os
がimport
を使用して導入できる理由でもある.インポートできるのは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つの条件が必要です.
このネーミングスペースで作成される識別子は、異なるインポートファイル方式で異なります.
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
のテストコードが実行されます.