Python3-python-modules
Python 3-モジュール
モジュールを使用すると、Pythonコードを論理的に整理できます。 関連するコードをモジュールにグループ化すると、コードの理解と使用が容易になります。 モジュールは、バインドおよび参照できる任意の名前の属性を持つPythonオブジェクトです。
簡単に言えば、モジュールはPythonコードで構成されるファイルです。 モジュールは、関数、クラス、変数を定義できます。 モジュールには、実行可能なコードを含めることもできます。
例
anameという名前のモジュールのPythonコードは通常、aname.pyという名前のファイルにあります。 これは、単純なモジュール、support.pyの例です-
インポートステートメント
他のPythonソースファイルでimportステートメントを実行することにより、任意のPythonソースファイルをモジュールとして使用できます。 *インポート*には次の構文があります-
インタープリターがimportステートメントを検出すると、モジュールが検索パスに存在する場合、モジュールをインポートします。 検索パスは、モジュールをインポートする前にインタープリターが検索するディレクトリーのリストです。 たとえば、モジュールhello.pyをインポートするには、スクリプトの先頭に次のコマンドを配置する必要があります-
上記のコードが実行されると、次の結果が生成されます-
モジュールは、インポートされた回数に関係なく、一度だけロードされます。 これにより、複数のインポートが発生した場合に、モジュールの実行が繰り返し発生するのを防ぎます。
from … importステートメント
Pythonの from ステートメントを使用すると、特定の属性をモジュールから現在のネームスペースにインポートできます。 from … import の構文は次のとおりです-
たとえば、モジュールfibから関数fibonacciをインポートするには、次のステートメントを使用します-
このステートメントは、モジュールfib全体を現在のネームスペースにインポートしません。モジュールfibから項目fibonacciをインポートモジュールのグローバルシンボルテーブルに導入するだけです。
from … import *ステートメント
また、次のインポートステートメントを使用して、モジュールから現在のネームスペースにすべての名前をインポートすることも可能です-
これにより、モジュールのすべてのアイテムを現在のネームスペースに簡単にインポートできます。ただし、このステートメントは慎重に使用する必要があります。
モジュールをスクリプトとして実行する
モジュール内では、モジュール名(文字列として)がグローバル変数nameの値として利用可能です。 モジュールのコードは、インポートした場合と同じように実行されますが、nameが "main"に設定されます。
あなたのモジュールの最後にこのコードを追加します-
上記のコードを実行すると、次の出力が表示されます。
モジュールの特定
あなたがモジュールをインポートすると、Pythonインタープリターは次のシーケンスでモジュールを検索します-
- 現在のディレクトリ
- モジュールが見つからない場合、Pythonはシェル変数PYTHONPATHで各ディレクトリを検索します。
- 他のすべてが失敗した場合、Pythonはデフォルトパスをチェックします。 UNIXでは、このデフォルトパスは通常/usr/local/lib/python3/です。
モジュール検索パスは、システムモジュールsysに sys.path 変数として保存されます。 sys.path変数には、現在のディレクトリ、PYTHONPATH、およびインストールに依存するデフォルトが含まれます。
PYTHONPATH変数
PYTHONPATHは、ディレクトリのリストで構成される環境変数です。 PYTHONPATHの構文は、シェル変数PATHの構文と同じです。
これは、Windowsシステムからの典型的なPYTHONPATHです-
そして、ここにUNIXシステムからの典型的なPYTHONPATHがあります-
名前空間とスコープ
変数は、オブジェクトにマップする名前(識別子)です。 _namespace_は、変数名(キー)とそれに対応するオブジェクト(値)の辞書です。
- Pythonステートメントは、_local namespace_および_global namespace_の変数にアクセスできます。 ローカル変数とグローバル変数の名前が同じ場合、ローカル変数はグローバル変数を隠します。
- 各関数には独自のローカル名前空間があります。 クラスメソッドは、通常の関数と同じスコープ規則に従います。
- Pythonは、変数がローカルであるかグローバルであるかについて知識に基づいた推測を行います。 関数内で値を割り当てられた変数はすべてローカルであると想定しています。
- したがって、関数内のグローバル変数に値を割り当てるには、最初にグローバルステートメントを使用する必要があります。
- ステートメント_global VarName_は、VarNameがグローバル変数であることをPythonに伝えます。 Pythonは変数のローカル名前空間の検索を停止します。
たとえば、グローバル名前空間で変数_Money_を定義します。 関数Money内で、Moneyに値を割り当てるため、PythonはMoneyをローカル変数と見なします。
ただし、設定する前にローカル変数_Money_の値にアクセスしたため、UnboundLocalErrorが結果になります。 グローバルステートメントのコメントを外すと、問題が修正されます。
dir()関数
dir()組み込み関数は、モジュールによって定義された名前を含むストリングのソート済みリストを返します。
リストには、モジュールで定義されているすべてのモジュール、変数、および関数の名前が含まれています。 以下は簡単な例です-
上記のコードが実行されると、次の結果が生成されます-
ここで、特別な文字列変数nameはモジュールの名前であり、fileはモジュールのロード元のファイル名です。
globals()およびlocals()関数
- globals()および locals()*関数を使用すると、呼び出し元の場所に応じて、グローバルおよびローカル名前空間の名前を返すことができます。
- * locals()*が関数内から呼び出された場合、その関数からローカルにアクセスできるすべての名前が返されます。
- * globals()*が関数内から呼び出された場合、その関数からグローバルにアクセスできるすべての名前が返されます。
これら両方の関数の戻り値の型は辞書です。 したがって、* keys()*関数を使用して名前を抽出できます。
reload()関数
モジュールをスクリプトにインポートすると、モジュールの最上位部分のコードは1回だけ実行されます。
したがって、モジュールの最上位コードを再実行する場合は、_reload()_関数を使用できます。 reload()関数は、以前にインポートされたモジュールを再度インポートします。 reload()関数の構文はこれです-
ここで、module_nameはリロードするモジュールの名前であり、モジュール名を含む文字列ではありません。 たとえば、helloモジュールをリロードするには、次のようにします-
Pythonのパッケージ
パッケージは、モジュール、サブパッケージ、サブサブパッケージなどで構成される単一のPythonアプリケーション環境を定義する階層ファイルディレクトリ構造です。
Phoneディレクトリにある_Pots.py_ファイルを考えてみましょう。 このファイルには、ソースコードの次の行があります-
同様に、上記と同じ名前の異なる機能を持つ他の2つのファイルがあります。 彼らは-
- _Phone/Isdn.py_関数Isdn()を持つファイル
- 関数G3()を持つ_Phone/G3.py_ファイル
今、_Phone_ディレクトリにもう1つのファイルinit.pyを作成します-
- Phone/init.py
Phoneをインポートしたときにすべての関数を使用できるようにするには、次のようにinit.pyに明示的なimportステートメントを配置する必要があります-
これらの行をinit.pyに追加すると、Phoneパッケージをインポートするときにこれらのクラスがすべて使用可能になります。
上記のコードが実行されると、次の結果が生成されます-
上記の例では、各ファイルに1つの関数の例を取り上げましたが、ファイルに複数の関数を保持できます。 また、これらのファイルにさまざまなPythonクラスを定義し、それらのクラスからパッケージを作成することもできます。