Python-modules

提供:Dev Guides
移動先:案内検索

Python-モジュール

モジュールを使用すると、Pythonコードを論理的に整理できます。 関連するコードをモジュールにグループ化すると、コードの理解と使用が容易になります。 モジュールは、バインドおよび参照できる任意の名前の属性を持つPythonオブジェクトです。

簡単に言えば、モジュールはPythonコードで構成されるファイルです。 モジュールは、関数、クラス、変数を定義できます。 モジュールには、実行可能なコードを含めることもできます。

_aname_というモジュールのPythonコードは、通常_aname.py_という名前のファイルにあります。 以下に、単純なモジュールsupport.pyの例を示します

def print_func( par ):
   print "Hello : ", par
   return

_import_ステートメント

他のPythonソースファイルでimportステートメントを実行することにより、任意のPythonソースファイルをモジュールとして使用できます。 _import_の構文は次のとおりです-

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

モジュールは、インポートされた回数に関係なく、一度だけロードされます。 これにより、複数のインポートが発生した場合にモジュールの実行が何度も繰り返されることを防ぎます。

_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に sys.path 変数として保存されます。 sys.path変数には、現在のディレクトリ、PYTHONPATH、およびインストールに依存するデフォルトが含まれます。

_PYTHONPATH_変数

PYTHONPATHは、ディレクトリのリストで構成される環境変数です。 PYTHONPATHの構文は、シェル変数PATHの構文と同じです。

これは、Windowsシステムからの典型的なPYTHONPATHです-

set PYTHONPATH = c:\python20\lib;

そして、ここにUNIXシステムからの典型的なPYTHONPATHがあります-

set PYTHONPATH =/usr/local/lib/python

名前空間とスコープ

変数は、オブジェクトにマップする名前(識別子)です。 _namespace_は、変数名(キー)とそれに対応するオブジェクト(値)の辞書です。

Pythonステートメントは、_local namespace_および_global namespace_の変数にアクセスできます。 ローカル変数とグローバル変数の名前が同じ場合、ローカル変数はグローバル変数を隠します。

各関数には独自のローカル名前空間があります。 クラスメソッドは、通常の関数と同じスコープ規則に従います。

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_はモジュールのロード元のファイル名です。

_globals()_および_locals()_関数

_globals()_および_locals()_関数を使用すると、呼び出し元の場所に応じて、グローバルおよびローカル名前空間の名前を返すことができます。

locals()が関数内から呼び出された場合、その関数からローカルにアクセスできるすべての名前を返します。

globals()が関数内から呼び出された場合、その関数からグローバルにアクセスできるすべての名前を返します。

これら両方の関数の戻り値の型は辞書です。 したがって、名前はkeys()関数を使用して抽出できます。

_reload()_関数

モジュールをスクリプトにインポートすると、モジュールの最上位部分のコードは1回だけ実行されます。

したがって、モジュールの最上位コードを再実行する場合は、_reload()_関数を使用できます。 reload()関数は、以前にインポートされたモジュールを再度インポートします。 reload()関数の構文はこれです-

reload(module_name)

ここで、_module_name_はリロードするモジュールの名前であり、モジュール名を含む文字列ではありません。 たとえば、_hello_モジュールをリロードするには、次のようにします-

reload(hello)

Pythonのパッケージ

パッケージは、モジュール、サブパッケージ、サブサブパッケージなどで構成される単一のPythonアプリケーション環境を定義する階層ファイルディレクトリ構造です。

_Phone_ディレクトリにある_Pots.py_ファイルを検討してください。 このファイルには、ソースコードの次の行があります-

#!/usr/bin/python

def Pots():
   print "I'm Pots Phone"

同様に、上記と同じ名前の異なる機能を持つ別の2つのファイルがあります-

  • _Phone/Isdn.py_関数Isdn()を持つファイル
  • 関数G3()を持つ_Phone/G3.py_ファイル

今、_Phone_ディレクトリにもう1つのファイルinit.pyを作成します-

  • Phone/init.py

Phoneをインポートしたときにすべての関数を使用可能にするには、次のようにinit.pyに明示的なimportステートメントを配置する必要があります-

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クラスを定義し、それらのクラスからパッケージを作成することもできます。