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