Pythonモジュール
モジュールを使用すると、Python コード スニペットを論理的に整理できます。
関連するコードをモジュールに割り当てると、コードがより使いやすく、理解しやすくなります。
モジュールも Python オブジェクトであり、バインドまたは参照用のランダムな名前属性を持ちます。
簡単に言うと、モジュールは Python コードを保存するファイルです。モジュールは関数、クラス、変数を定義できます。モジュールには実行可能コードを含めることもできます。
例
aname というモジュールの Python コードは、通常、aname.py というファイルにあります。次の例は、単純なモジュール support.py です。
print "Hello : ", par
return
import ステートメント
Python ソース ファイルを使用したい場合は、別のソース ファイルで import ステートメントを実行するだけです。は次のとおりです:
インタプリタが import ステートメントに遭遇すると、モジュールが現在の検索パスにあればインポートされます。
検索パスは、インタープリターが最初に検索するすべてのディレクトリのリストです。モジュール hello.py をインポートしたい場合は、スクリプトの先頭にコマンドを置く必要があります:
# -*-coding: UTF-8 -*-
# インポートモジュール
import support
# これで、モジュールに含まれる関数を呼び出すことができます
support.print_func("Zara")
上記の例の出力結果:
A moduleどのように実行しても、インポートされるのは 1 回だけです。インポートする回数。これにより、インポートされたモジュールが何度も実行されるのを防ぎます。
From…import ステートメント
Python の from ステートメントを使用すると、指定した部分をモジュールから現在の名前空間にインポートできます。構文は次のとおりです:
たとえば、モジュール fib のフィボナッチ関数をインポートするには、次のステートメントを使用します。
このステートメントは、fib モジュール全体を現在の名前空間にインポートするのではなく、この宣言を実行するモジュールのグローバル シンボル テーブルに fib 内のフィボナッチを個別に導入するだけです。
From...import* ステートメント
次のステートメントを使用するだけで、モジュールのすべてのコンテンツを現在の名前空間にインポートすることも可能です:
これにより、モジュール内のすべてのプロジェクトを簡単にインポートできます。ただし、このステートメントは乱用すべきではありません。
ロケーションモジュール
モジュールをインポートするとき、モジュールの場所に対するPythonパーサーの検索順序は次のとおりです:
現在のディレクトリ
それが現在のディレクトリにない場合、Pythonは以下のすべてのエントリを検索しますシェル変数 PYTHONPATH ディレクトリ。
どちらも見つからない場合、Python はデフォルトのパスをチェックします。 UNIX では、通常、デフォルトのパスは /usr/local/lib/python/ です。
モジュールの検索パスは、システム モジュールの sys.path 変数に保存されます。変数には、現在のディレクトリ、PYTHONPATH、およびインストール プロセスによって決定されるデフォルトのディレクトリが含まれます。
PYTHONPATH変数
環境変数として、PYTHONPATHはリストにインストールされた多数のディレクトリで構成されます。 PYTHONPATH の構文は、シェル変数 PATH の構文と同じです。
Windows システムの場合、一般的な PYTHONPATH は次のとおりです:
UNIX システムの場合、一般的な PYTHONPATH は次のとおりです:
名前空間とスコープ
変数とは、一致するオブジェクトを保持する名前 (識別子) です。名前空間は、変数名 (キー) とそれに対応するオブジェクト (値) を含む辞書です。
Python 式は、ローカル名前空間とグローバル名前空間の変数にアクセスできます。ローカル変数がグローバル変数と同じ名前を持つ場合、ローカル変数はグローバル変数をオーバーライドします。
各関数には独自の名前空間があります。クラスメソッドのスコープ規則は、通常の関数の場合と同じです。
Python は、関数内で割り当てられた変数がローカルであると仮定して、変数がローカルであるかグローバルであるかをインテリジェントに推測します。
したがって、関数内のグローバル変数に値を代入したい場合は、global ステートメントを使用する必要があります。
グローバル VarName の式は、VarName がグローバル変数であることを Python に伝えるため、Python はローカル名前空間でこの変数を検索しません。
たとえば、グローバル名前空間で変数 Money を定義します。次に、関数内で変数moneyに値を代入すると、Pythonはmoneyがローカル変数であると想定します。ただし、アクセスする前にローカル変数 Money を宣言していないため、結果は UnboundLocalError になります。グローバル ステートメントのコメントを解除すると、この問題を解決できます。
# -*-coding: UTF-8 -*-
Money = 2000
def AddMoney():
# コードを修正したい場合は、次のコメントを解除してください:
# グローバルマネー
Money = Money + 1
print Money
AddMoney()
print Money
dir() 関数
dir() 関数は文字列のソートされたリストであり、その内容はモジュールで定義された名前です。
返されるリストには、モジュールで定義されているすべてのモジュール、変数、関数が含まれます。以下に簡単な例を示します:
# -*-coding: UTF-8 -*-
# 組み込み数学モジュールをインポートする
import math
content = dir(math )
print content;
上記の出力結果の例:
'atan2', 'ceil '、'cos'、'cosh'、'degrees'、'e'、'exp'、
'fabs'、'floor'、'fmod'、'frexp'、'hypot'、'ldexp'、' log',
'log10 ', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh']
ここでは、特殊文字列 variable_ _name__ はモジュールの名前を指し、 __file__ はモジュールのインポート ファイルの名前を指します。
globals() 関数と locals() 関数
呼び出される場所に応じて、globals() 関数と locals() 関数を使用して、グローバル名前空間とローカル名前空間の名前を返すことができます。
locals() が関数内で呼び出された場合、関数内でアクセスできるすべての名前が返されます。
globals() が関数内で呼び出された場合、関数内でアクセスできるすべてのグローバル名が返されます。
両方の関数の戻り値の型は辞書です。したがって、keys() 関数を使用して名前を抽出できます。
reload() 関数
モジュールがスクリプトにインポートされるとき、モジュールのトップレベル部分のコードは 1 回だけ実行されます。
そのため、モジュール内のトップレベルのコードを再実行したい場合は、 reload() 関数を使用できます。この関数は、以前にインポートされたモジュールを再インポートします。構文は次のとおりです。
ここで、 module_name には文字列形式ではなくモジュールの名前を直接入力する必要があります。たとえば、hello モジュールをリロードする場合は、次のようにします。
Python のパッケージ
パッケージは、モジュールとサブパッケージを定義する階層的なファイル ディレクトリ構造であり、サブパッケージ Python アプリケーション環境はサブパッケージで構成されます。
電話ディレクトリ内の Pots.py ファイルについて考えてみましょう。このファイルには次のソース コードがあります:
# -*-coding: UTF-8 -*-
def Pots():
print "I'm Pots Phone"
同様に、異なる関数を保持する他のファイルが 2 つあります: 関数 Isdn() を含む Phone/Isdn.py 関数 G3() を含む Phone/G3.py
Now , Phone ディレクトリにファイル __init__.py を作成します:
Phone/__init__.py
Phone をインポートするとき、すべての機能を使用できるようにするには、__init__.py で明示的なインポート ステートメントを使用する必要があります。 , 以下のように:
- from Pots import Pots
from Isdn import Isdn
from G3 import G3
これらのコードを __init__.py に追加すると、Phone パッケージをインポートするときにこれらのクラスがすべて使用できるようになります。
# -*- コーディング: UTF-8 -*-
Phone.Pots()
上記の例の出力結果:
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone
上記のように、例のために、関数を 1 つだけ配置しました各ファイルには、実際には多くの関数を配置できます。これらのファイルで Python クラスを定義し、これらのクラスのパッケージを構築することもできます。