TL;DR
Python のクラスや関数などのコードを書いた .py という拡張子のファイルはモジュールと呼ばれ、モジュールをまとめたものをパッケージと呼ぶ。再利用したり、保守性を高めるために利用するとよい。パッケージの中身は、モジュールやサブパッケージが集約されている。
モジュールのポイント
モジュール
- クラスや関数をコードをまとめたファイル
- import module として使う
- 自作のモジュールを作ることができる
- from 節を使うと、モジュールから特定の属性のみをインポートできる
- カンマ区切り(,)で、複数の属性をインポートできる
- ドット区切り(.)で、サブパッケージを指定できる
- ワイルドカード(*)で、複数の属性を一括インポートできる
パッケージ
- .py ファイルを格納するサブディレクトリ
- 複数のモジュールをまとめる
- 目印として
__init__.py
を配置する
※ __init__.py
は、目印の他にパッケージの初期化をする機能がある。パッケージがインポートされると、最初に実行される。
名前空間
- 「名前」が衝突しないように、使用する名前の空間を分けること
6. モジュール (module) — Python 3.6.13 ドキュメント
モジュールのインポート
モジュールのインポートは以下のように記述する。
import モジュール名
モジュールの中の関数を使うには以下のように記述する。
モジュール名.モジュール内の関数名
モジュールの使い方
それでは実際に作ってみよう。同じディレクトリに、読み込み元の foo.py ファイル、インポート先の hello.py ファイルを作ってみる。
foo.py というファイルには、リストの要素をランダムで抽出するモジュールを読み込ませる。
from random import choice
lang = ['Python', 'Go', 'Rust']
def func():
return choice(lang)
hello.py というファイルを作り、foo.py ファイルをインポートするコードを記述する。
import foo
lang = foo.func()
print(lang)
その結果、読み込み元のファイルが実行され結果が返される。
dir()メソッドを使って確認すると、foo.py モジュールのトップレベルのオブジェクトを確認することができる。
# hello.py
import foo
lang = foo.func()
print(dir(foo))
# [...'choice'...]
as
長過ぎるモジュール名を短縮したり、どこかに同じファイルが存在するなどの理由で、別名で呼び出したい時は、モジュール名のあとに as をつけ、新たに名前をつけるとよい。
import foo as f
lang = f.func()
print(lang)
モジュールの名前
モジュールをインポートするとその__name__属性
にモジュールの名前が文字列として格納される。<モジュール名>.__name__
で取得できる。
import math
print(math.__name__)
# math
数学の機能をまとめた math というモジュールを使う場合。
import math
print(math.pi) # πの値
関数を、そのままの名前で書くとこうなる。
from モジュール名 import モジュール内の関数名
from math import pi
print(pi) # πの値
複数のモジュールをインポートする場合は、関数名をカンマ区切りする。
モジュールをスクリプトとして実行
このイディオムは、モジュールをスクリプトとして利用したい場合に使う。
「コマンドラインからスクリプトとして直接実行したときに、以降の処理を行う」という意味を持つ。
if __name__ == "__main__":
参考 : スクリプトとして直接実行したときのみ処理を行う記述
if 文の左辺に記述されている、特殊変数__name__
は、Python ごとに、そのファイル名が格納される。
if 文の右辺に記述されている、特殊変数__main__
は、Python コマンドから直接実行されたときに、この名前が格納される。
Python のスクリプトは、インポートしただけでファイルに記述した処理が実行されてしまう。しかし、自動実行が困るケースもある。できることなら、インポートされたときは自動実行をさせず、スクリプトとして直接実行したときだけ処理を行いたい。
そんなときに、この if 文で判定すると スクリプトとして直接実行したときのみ処理を行う ことができる。
Python のコードは、コマンドから直接実行されるか、他のプログラムをインポートして呼ばれる。その判定を行うことができる。インポート元のファイルの末尾に以下を加えることで、スクリプトとしても使えるようになる。
読込先のファイル
import インポート元
print('処理')
インポート元のファイル
def main()
print('処理')
if __name__ == "__main__":
main()