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

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

...輸入声明

Pythonのfromステートメントを使用すると、特定の属性をモジュールから現在の名前空間にインポートできます。...インポートは、次の構文を持っています-

from modname import name1[, name2[, ... nameN]]

たとえば、モジュールfibから関数fibonacciをインポートするには、次のステートメントを使用します。

from fib import fibonacci

このステートメントは、モジュールfib全体を現在の名前空間にインポートしません。モジュールfibからインポートするモジュールのグローバルシンボルテーブルにアイテムfibonacciを導入するだけです。

...インポート*ステートメント

次のインポートステートメントを使用して、モジュールから現在の名前空間にすべての名前をインポートすることもできます。

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

名前空間とスコープ

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

Pythonステートメントは、ローカル名前空間グローバル名前空間の変数にアクセスできます。ローカル変数とグローバル変数の名前が同じである場合、ローカル変数はグローバル変数をシャドウイングします。

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

Pythonは、変数がローカルかグローバルかについて、知識に基づいて推測します。関数内で値が割り当てられた変数はすべてローカルであると想定しています。

したがって、関数内のグローバル変数に値を割り当てるには、最初にグローバルステートメントを使用する必要があります。

声明グローバル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()を持つPhone /G3.pyファイル

ここで、電話帳にもう1つのファイル__init__。pyを作成します-

  • 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

上記の例では、各ファイルに1つの関数の例を示しましたが、ファイルに複数の関数を保持することもできます。これらのファイルでさまざまなPythonクラスを定義して、それらのクラスからパッケージを作成することもできます。