Python モジュール
Python モジュール(Module)は、.py で終わる Python ファイルであり、Python オブジェクトの定義と Python 文が含まれています。
モジュールを使うと、Python コードを論理的に整理できます。
関連するコードを1つのモジュールにまとめると、コードがより使いやすく、分かりやすくなります。
モジュールは関数、クラス、変数を定義でき、実行可能なコードも含めることができます。
例
次の例は、単純なモジュール support.py です:
support.py モジュール:
import 文
モジュールのインポート
モジュールを定義したら、import 文を使用してモジュールをインポートできます。構文は次のとおりです:
import module1[, module2[,... moduleN]]
たとえば、モジュール math を参照するには、ファイルの先頭で次のようにします。import mathでインポートします。math モジュール内の関数を呼び出すときは、次のように参照する必要があります:
モジュール名.関数名
インタープリターが import 文に遭遇すると、モジュールが現在の検索パスにあればインポートされます。
検索パスとは、インタープリターが最初に検索するすべてのディレクトリのリストです。モジュール support.py をインポートするには、スクリプトの先頭にコマンドを置く必要があります:
test.py ファイルコード:
上記の例の出力結果:
Hello : サンプル
モジュールは、import を何回実行しても一度だけインポートされます。これにより、インポートしたモジュールが何度も実行されるのを防げます。
from…import 文
Python の from 文を使用すると、モジュールから指定した部分を現在の名前空間にインポートできます。構文は次のとおりです:
from modname import name1[, name2[, ... nameN]]
たとえば、モジュール fib の fibonacci 関数をインポートするには、次の文を使用します:
from fib import fibonacci
この宣言は、fib モジュール全体を現在の名前空間にインポートするのではなく、fib 内の fibonacci だけを、この宣言を実行するモジュールのグローバルシンボルテーブルに導入します。
from…import* 文
モジュールのすべての内容を現在の名前空間にインポートすることも可能です。次の宣言を使用するだけです:
from modname import *
これは、モジュール内のすべての項目をインポートする簡単な方法を提供します。ただし、この宣言は多用すべきではありません。
たとえば、math モジュールのすべてを一度にインポートしたい場合、文は次のとおりです:
from math import *
検索パス
モジュールをインポートするとき、Python パーサーはモジュールの場所を次の順序で検索します:
- 1、現在のディレクトリ
- 2、現在のディレクトリにない場合、Python はシェル変数 PYTHONPATH の下にある各ディレクトリを検索します。
- 3、見つからない場合、Python はデフォルトのパスを確認します。UNIX では、デフォルトのパスは通常 /usr/local/lib/python/ です。
モジュールの検索パスは、system モジュールの sys.path 変数に格納されています。この変数には、現在のディレクトリ、PYTHONPATH、およびインストールプロセスによって決定されるデフォルトのディレクトリが含まれます。
PYTHONPATH 変数
環境変数として、PYTHONPATH はリストに格納された多くのディレクトリで構成されます。PYTHONPATH の構文はシェル変数 PATH と同じです。
Windows システムでは、典型的な PYTHONPATH は次のとおりです:
set PYTHONPATH=c:\python27\lib;
UNIX システムでは、典型的な PYTHONPATH は次のとおりです:
set PYTHONPATH=/usr/local/lib/python
名前空間とスコープ
変数は、対応するオブジェクトを持つ名前(識別子)です。名前空間は、変数名(キー)とそれに対応する各オブジェクト(値)を含む辞書です。
Python の式は、ローカル名前空間とグローバル名前空間の変数にアクセスできます。ローカル変数とグローバル変数が同名の場合、ローカル変数がグローバル変数を上書きします。
各関数には独自の名前空間があります。クラスのメソッドのスコープ規則は通常の関数と同じです。
Python は変数がローカルかグローバルかを賢く推測し、関数内で代入された変数はすべてローカルであると見なします。
したがって、関数内のグローバル変数に代入するには、global 文を使用する必要があります。
global VarName の式は、Python に VarName がグローバル変数であることを伝えます。これにより、Python はローカル名前空間でこの変数を探さなくなります。
たとえば、グローバル名前空間で変数 Money を定義します。関数内で変数 Money に代入すると、Python は Money をローカル変数と見なします。しかし、アクセスする前にローカル変数 Money を宣言していないため、UnboundLocalError エラーが発生します。global 文の前のコメントアウトを解除すれば、この問題を解決できます。
#!/usr/bin/python # -*- coding: UTF-8 -*- Money = 2000 def AddMoney(): # 想改正代码就取消以下注释: # global Money Money = Money + 1 print Money AddMoney() print Money
dir() 関数
dir() 関数は、ソートされた文字列のリストであり、内容はモジュール内で定義された名前です。
返されるリストには、モジュール内で定義されたすべてのモジュール、変数、関数が含まれます。次の簡単な例を見てみましょう:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 导入内置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() 関数
モジュールがスクリプトにインポートされると、モジュールのトップレベルのコードは一度だけ実行されます。
したがって、モジュールのトップレベルのコードを再実行したい場合は、reload() 関数を使用できます。この関数は、以前にインポートしたモジュールを再インポートします。構文は次のとおりです:
reload(module_name)
ここで、module_name にはモジュール名を直接入れます。文字列形式ではありません。たとえば、hello モジュールをリロードしたい場合は、次のようにします:
reload(hello)
Python のパッケージ
パッケージは階層的なファイルディレクトリ構造であり、モジュールとサブパッケージ、およびサブパッケージの下のサブパッケージなどから構成される Python アプリケーション環境を定義します。
簡単に言うと、パッケージはフォルダーですが、そのフォルダーには __init__.py ファイルが存在しなければなりません。このファイルの内容は空でもかまいません。__init__.py現在のフォルダーがパッケージであることを示すために使用されます。
次のディレクトリ内にあるpackage_サンプルディレクトリ配下のサンプル1.py、サンプル2.py、__init__.py ファイルを考えます。test.py はパッケージ呼び出しをテストするコードで、ディレクトリ構造は次のとおりです:
test.py package_サンプル |-- __init__.py |-- サンプル1.py |-- サンプル2.pyソースコードは次のとおりです:
package_サンプル/サンプル1.py
package_サンプル/サンプル2.py
では、package_サンプルディレクトリ下に作成し__init__.py:
package_サンプル/__init__.py
そして、package_サンプル 同じ階層のディレクトリの下に test.py を作成して呼び出しますpackage_サンプル 包
test.py
上記の例の出力結果:
package_サンプル 初始化 I'm in サンプル1 I'm in サンプル2
上記のように、例を示すために各ファイルに1つの関数だけを置きましたが、実際には多くの関数を置くことができます。また、これらのファイルに Python のクラスを定義し、それらのクラス用のパッケージを作成することもできます。
その他の拡張