Contents
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]
インタプリタがインポート文を検出すると、モジュールが検索パスに存在する場合、モジュールはインポートされます。検索パスは、インタープリタがモジュールをインポートする前に検索するディレクトリのリストです。たとえば、モジュール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
モジュールは、インポートされた回数にかかわらず、一度だけロードされます。これにより、複数のインポートが発生した場合でも、モジュールの実行が何度も繰り返されることはありません。
…輸入声明
Pythonのfromステートメントを使用すると、特定の属性をモジュールから現在の名前空間にインポートできます。…インポートは、次の構文を持っています-
from modname import name1[, name2[, ... nameN]]
たとえば、関数fibonacciをモジュールfibからインポートするには、次のステートメントを使用します。
from fib import fibonacci
このステートメントは、モジュール全体を現在のネームスペースにインポートしません。モジュールfibからのフィボナッチアイテムを、インポートするモジュールのグローバルシンボルテーブルに導入するだけです。
…インポート*の声明:
次の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 VarNameは、VarNameがグローバル変数であることをPythonに伝えます。Pythonは変数のローカル名前空間の検索を停止します。
たとえば、グローバル名前空間に変数Moneyを定義します。関数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__はモジュールがロードされたファイル名です。
グローバル()と地元の人々 ()関数-
グローバル()と地元の人々 ()関数は、それらが呼ばれている場所から場所に応じて、グローバルとローカルの名前空間内の名前を返すために使用することができます。
locals()が関数内から呼び出されると、その関数からローカルにアクセスできるすべての名前が返されます。
globals()が関数内から呼び出された場合、その関数からグローバルにアクセスできるすべての名前が返されます。
これらの関数の戻り値の型は辞書です。したがって、keys()関数を使用して名前を抽出することができます。
リロード()関数
モジュールをスクリプトにインポートすると、モジュールの最上位部分のコードが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()を持つPhone / Isdn.pyファイル
- 機能G3()を持つ電話/ G3.pyファイル
今度は、電話ディレクトリにもう1つのファイル__init__.pyを作成してください。
- 電話/ __ init__.py
電話をインポートしたときにすべての関数を利用できるようにするには、次のように明示的なimport文を__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クラスを定義し、それらのクラスからパッケージを作成することもできます。