Python-モジュール
前のページ次のページ
モジュールを使用すると、Python コードを論理的に編成できます。関連するコードをモジュールにグループ化すると、コードが理解しやすく、使いやすくなります。モジュールは、バインドおよび参照できる任意の名前の属性を持つ Python オブジェクトです。
簡単に言うと、モジュールは Python コードで構成されるファイルです。モジュールは、関数、クラス、および変数を定義できます。モジュールには、実行可能なコードを含めることもできます。
例
aname という名前のモジュールの Python コード 通常は aname.py という名前のファイルにあります .簡単なモジュールの例、support.py を次に示します。
def print_func( par ): print "Hello : ", par return
インポート 声明
他の Python ソース ファイルで import ステートメントを実行することにより、任意の Python ソース ファイルをモジュールとして使用できます。 インポート 次の構文があります-
import module1[, module2[,... moduleN]
インタープリターが import ステートメントに遭遇すると、モジュールが検索パスに存在する場合、モジュールをインポートします。検索パスは、モジュールをインポートする前にインタプリタが検索するディレクトリのリストです。たとえば、モジュール support.py をインポートするには、次のコマンドをスクリプトの先頭に配置する必要があります −
#!/usr/bin/python # Import module support import support # Now you can call defined function that module as follows support.print_func("Zara")
上記のコードが実行されると、次の結果が生成されます-
Hello : Zara
モジュールは、インポートの回数に関係なく、1 回だけロードされます。これにより、複数のインポートが発生した場合にモジュールの実行が何度も繰り返されるのを防ぎます。
from...import 声明
Python の from ステートメントを使用すると、特定の属性をモジュールから現在の名前空間にインポートできます。 from...import 次の構文があります-
from modname import name1[, name2[, ... nameN]]
たとえば、モジュール fib から関数 fibonacci をインポートするには、次のステートメントを使用します −
from fib import fibonacci
このステートメントは、モジュール fib 全体を現在の名前空間にインポートしません。モジュール fib からアイテム fibonacci をインポート モジュールのグローバル シンボル テーブルに導入するだけです。
from...import * 声明
次のインポートステートメントを使用して、モジュールから現在の名前空間にすべての名前をインポートすることもできます-
from modname import *
これにより、すべての項目をモジュールから現在の名前空間に簡単にインポートできます。ただし、このステートメントは慎重に使用する必要があります。
モジュールの検索
モジュールをインポートすると、Python インタープリターは次の順序でモジュールを検索します −
-
現在のディレクトリ。
-
モジュールが見つからない場合、Python はシェル変数 PYTHONPATH 内の各ディレクトリを検索します。
-
他のすべてが失敗した場合、Python はデフォルト パスをチェックします。 UNIX では、このデフォルト パスは通常 /usr/local/lib/python/ です。
モジュールの検索パスは、sys.path としてシステム モジュール sys に格納されます。 変数。 sys.path 変数には、現在のディレクトリ、PYTHONPATH、およびインストールに依存するデフォルトが含まれます。
PYTHONPATH 変数
PYTHONPATH は、ディレクトリのリストで構成される環境変数です。 PYTHONPATH の構文は、シェル変数 PATH の構文と同じです。
これは、Windows システムからの典型的な PYTHONPATH です −
set PYTHONPATH = c:\python20\lib;
そして、これは UNIX システムからの典型的な PYTHONPATH です −
set PYTHONPATH = /usr/local/lib/python
名前空間とスコープ
変数は、オブジェクトにマップされる名前 (識別子) です。 名前空間 変数名 (キー) とそれに対応するオブジェクト (値) の辞書です。
Python ステートメントは、ローカル名前空間の変数にアクセスできます グローバル名前空間 .ローカル変数とグローバル変数が同じ名前の場合、ローカル変数はグローバル変数を隠します。
各関数には、独自のローカル名前空間があります。クラス メソッドは、通常の関数と同じスコープ規則に従います。
Python は、変数がローカルかグローバルかについて、経験に基づいた推測を行います。関数で値が割り当てられた変数はすべてローカルであると想定しています。
したがって、関数内でグローバル変数に値を代入するには、最初に global ステートメントを使用する必要があります。
ステートメント global VarName VarName がグローバル変数であることを Python に伝えます。 Python は変数のローカル名前空間の検索を停止します。
たとえば、変数 Money を定義します グローバル名前空間で。関数 Money 内 、お金を割り当てます 値なので、Python は Money を想定しています ローカル変数として。ただし、ローカル変数 Money の値にアクセスしました 設定する前に、 UnboundLocalError が結果になります。グローバル ステートメントのコメントを解除すると、問題が解決します。
#!/usr/bin/python Money = 2000 def AddMoney(): # Uncomment the following line to fix the code: # global Money Money = Money + 1 print Money AddMoney() print Money
dir( ) 関数
dir() 組み込み関数は、モジュールによって定義された名前を含む文字列のソートされたリストを返します。
リストには、モジュールで定義されているすべてのモジュール、変数、および関数の名前が含まれています。以下は簡単な例です-
ライブデモ#!/usr/bin/python # Import built-in module math import math content = dir(math) print content
上記のコードが実行されると、次の結果が生成されます-
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
ここで、特別な文字列変数 __name__ はモジュールの名前、__file__ モジュールがロードされたファイル名です。
globals() および locals() 関数
globals() および locals() 関数を使用して、呼び出された場所に応じて、グローバルおよびローカル名前空間の名前を返すことができます。
locals() が関数内から呼び出された場合、その関数からローカルにアクセスできるすべての名前が返されます。
globals() が関数内から呼び出された場合、その関数からグローバルにアクセスできるすべての名前が返されます。
これら両方の関数の戻り値の型は辞書です。したがって、keys() 関数を使用して名前を抽出できます。
reload() 機能
モジュールがスクリプトにインポートされると、モジュールの最上位部分のコードが 1 回だけ実行されます。
したがって、モジュールの最上位コードを再実行する場合は、reload() を使用できます。 関数。 reload() 関数は、以前にインポートされたモジュールを再度インポートします。 reload() 関数の構文は次のとおりです −
reload(module_name)
ここでは、module_name モジュール名を含む文字列ではなく、リロードするモジュールの名前です。たとえば、hello をリロードするには モジュールで、次のことを行います −
reload(hello)
Python のパッケージ
パッケージは、モジュール、サブパッケージ、サブサブパッケージなどで構成される単一の Python アプリケーション環境を定義する階層的なファイル ディレクトリ構造です。
ファイル Pots.py を考えてみましょう 電話で利用可能 ディレクトリ。このファイルには、次のソース コード行があります −
#!/usr/bin/python def Pots(): print "I'm Pots Phone"
同様に、上記と同じ名前で異なる機能を持つ別の 2 つのファイルがあります −
-
電話/Isdn.py 関数 Isdn() を持つファイル
-
Phone/G3.py 関数 G3() を持つファイル
次に、Phone に __init__.py ファイルをもう 1 つ作成します。 ディレクトリ−
- Phone/__init__.py
Phone をインポートしたときにすべての関数を使用できるようにするには、次のように __init__.py に明示的なインポート ステートメントを配置する必要があります −
from Pots import Pots from Isdn import Isdn from G3 import G3
これらの行を __init__.py に追加すると、Phone パッケージをインポートするときにこれらすべてのクラスを使用できるようになります。
#!/usr/bin/python # Now import your Phone Package. import Phone Phone.Pots() Phone.Isdn() Phone.G3()
上記のコードが実行されると、次の結果が生成されます-
I'm Pots Phone I'm 3G Phone I'm ISDN Phone
上記の例では、各ファイルに単一の関数の例を示しましたが、ファイルに複数の関数を保持できます。これらのファイルでさまざまな Python クラスを定義して、それらのクラスからパッケージを作成することもできます。
Python