Python3-モジュール

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

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

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

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

輸入声明

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

import module1[, module2[,... moduleN]

インタプリタがimportステートメントを検出すると、モジュールが検索パスに存在する場合、インタプリタはモジュールをインポートします。検索パスは、モジュールをインポートする前にインタプリタが検索するディレクトリのリストです。たとえば、モジュールhello.pyをインポートするには、スクリプトの先頭に次のコマンドを配置する必要があります-

#!/usr/bin/python3

# 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をインポートするには、次のステートメントを使用します。

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

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

from ... import *ステートメント

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

from modname import *

これにより、モジュールから現在の名前空間にすべてのアイテムをインポートする簡単な方法が提供されます。ただし、このステートメントは慎重に使用する必要があります。

モジュールをスクリプトとして実行する

モジュール内では、モジュールの名前(文字列として)がグローバル変数__name__の値として使用できます。モジュール内のコードは、インポートした場合と同じように実行されますが、__ name__は「__main__」に設定されています。

モジュールの最後にこのコードを追加します-

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
if __name__ == "__main__":
   f = fib(100)
   print(f)

上記のコードを実行すると、次の出力が表示されます。

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

モジュールの検索

モジュールをインポートすると、Pythonインタープリターは次の順序でモジュールを検索します-

  • 現在のディレクトリ。

  • モジュールが見つからない場合、Pythonはシェル変数PYTHONPATH内の各ディレクトリを検索します。

  • 他のすべてが失敗した場合、Pythonはデフォルトのパスをチェックします。UNIXでは、このデフォルトパスは通常/ usr / local / lib / python3 /です。

モジュール検索パスは、システムモジュールsysに次のように保存されます。 sys.path変数。sys.path変数には、現在のディレクトリ、PYTHONPATH、およびインストールに依存するデフォルトが含まれています。

PYTHONPATH変数

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

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

set PYTHONPATH = c:\python34\lib;

そしてこれがUNIXシステムからの典型的なPYTHONPATHです-

set PYTHONPATH = /usr/local/lib/python

名前空間とスコープ

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

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

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

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

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

  • 声明グローバルVARNAMEはVARNAMEはグローバル変数であることはPythonを伝えます。Pythonは、ローカル名前空間で変数の検索を停止します。

たとえば、グローバル名前空間で変数Moneyを定義します。関数Money内で、Moneyに値を割り当てるため、PythonはMoneyをローカル変数と見なします。

ただし、設定する前にローカル変数Moneyの値にアクセスしたため、結果はUnboundLocalErrorになります。グローバルステートメントのコメントを解除すると、問題が修正されます。

#!/usr/bin/python3

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/python3

# 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)

Here, module_name is the name of the module you want to reload and not the string containing the module name. For example, to reload hello module, do the following −

reload(hello)

Packages in Python

A package is a hierarchical file directory structure that defines a single Python application environment that consists of modules and subpackages and sub-subpackages, and so on.

Consider a file Pots.py available in Phone directory. This file has the following line of source code −

#!/usr/bin/python3

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

Similar, we have other two files having different functions with the same name as above. They are −

  • Phone/Isdn.py file having function Isdn()

  • Phone/G3.py file having function G3()

Now, create one more file __init__.py in the Phone directory −

  • Phone/__init__.py

To make all of your functions available when you have imported Phone, you need to put explicit import statements in __init__.py as follows −

from Pots import Pots
from Isdn import Isdn
from G3 import G3

After you add these lines to __init__.py, you have all of these classes available when you import the Phone package.

#!/usr/bin/python3

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

When the above code is executed, it produces the following result −

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

In the above example, we have taken example of a single function in each file, but you can keep multiple functions in your files. You can also define different Python classes in those files and then you can create your packages out of those classes.