この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、関数の記述方法と注意する点について紹介しました。Pythonの関数の性質がわかってきたと思います。

今回はモジュールです。Pythonはプログラムでよく使うコードを部品にできます。
モジュールの呼び出し
フォルダーの中に、ファイル「mod_1.py」を作成します。内容は以下の通りです。
#mod_1.py def calc_area(x, y): return x * y
四角形の面積を求める関数「calc_area」が記述されています。次に同じフォルダー内に以下のファイル「m_test01.py」を作成実行します。
#m_test01.py import mod_1 height, width = 3, 5 print(mod_1.calc_area(height, width)) # 15が返ってくる
print関数で数値「15」が返ってきます。これは、同じフォルダーにある「mod_1.py」内の関数「calc_area」を呼び出して計算をした結果です。モジュールを呼び出すにはimport文を使用します。モジュール内の関数、変数、クラス(本連載ではまだ触れていません)などを使用する場合には、以下のように記述します。
モジュール名.名前
名前の部分には、関数名、変数名、クラス名などが当てはまります。
モジュール呼び出し時の挙動
次に同じフォルダーの中に、「mod_2.py」を作成します。内容は以下の通りです。
#mod_2.py def calc_area(x, y): return x * y x = 2 y = 3 print(calc_area(x, y)) # 6が返ってくる
今度は関数以外に、関数を呼び出しているコードが書かれています。このコード自体を実行すると「6」が返って来ます。次に同じフォルダー内に以下のファイル「m_test02.py」を作成実行します。
#m_test02.py import mod_2 # 6が返ってくる print(mod_2.x) # 2が返ってくる height, width = 3, 5 print(mod_2.calc_area(height, width)) # 15が返ってくる
今度はモジュールをインポートした際に、「6」が返ってきました。これは「mod_2.py」をインポートした際にファイル内のコードが実行されたことを意味します。次に「mod_1.x」でモジュール内のxを読み込めていることが、確認できます。最後はモジュール内の関数を呼び出して計算結果を返しています。
import文は実行された際に、指定したモジュール自体を実行しているのです。
呼び出し時に実行しないようにするには
import実行時に、モジュール自体を実行して問題ない場合はこれでいいのですが、記載してある関数などを使用したいだけの場合は以下のように記述します。
#mod_3.py def calc_area(x, y): return x * y if __name__ == '__main__': x = 2 y = 3 print(calc_area(x, y)) # 6が返ってくる
今度は関数以外のコードの前にif文が記載されています。こちらのコード自体も実行すると「6」が返って来ます。次に同じフォルダー内に以下のファイル「m_test03.py」を作成実行します。
#m_test03.py import mod_3 # 何も返ってこない # print(mod_3.x) # エラーになる height, width = 3, 5 print(mod_3.calc_area(height, width)) # 15が返ってくる
今度はインポート時に何も返ってきませんでした。また、「mod_3.x」にアクセスしようとするとエラーになりました。最後の関数呼び出しのみ実行されています。
nameとは
「name」は、プログラムを実行する際に自動的に作成される特殊な変数です。特殊属性とも言います。この変数には、実行中のプログラムのモジュール名が自動的に代入されます。また、変数名の前後にアンダースコア2つで括っていますが、これを「ダンダー」と呼びます。
フォルダーの中に、「mod_4.py」を作成して実行してみましょう。
#mod_4.py def func_test(): pass print(__name__) #直接実行した場合は'__main__'が返ってくる
この様に、自分自身を実行している場合はnameに'main'が代入されます。次に同じフォルダー内に以下のファイル「m_test04.py」を作成実行します。
#m_test04.py import mod_4 #呼び出した場合には'mod_4'が返ってくる
今度はモジュール名'mod_4'が返ってきました。この様にnameを使うと、モジュールが単体で実行されたのか、呼び出されたものなのかを識別できます。
モジュール内に、デバッグ用のコード等を書いて置いておいて、実際の使用時には実行させたくない場合、
if __name__ == '__main__':
の後にコードを置いておくと、管理しやすいです。
次回もモジュール
いかがでしようか。モジュールは本格的な開発には欠かせない機能なので、しっかり身につけたいところです。次回もモジュールです。便利な読み込み方を学びます。お楽しみに!!