モジュールやパッケージの使い方をまとめました。自作モジュールは大きなプログラムを書く上で重要になります。また、標準モジュールや配布されているスクリプトの理解にも非常に重要な知識です。
自作モジュールの使い方:その1 同じディレクトリに置く
実行ファイルと同じディレクトリにモジュールを置いてインポートします。例えば、以下の「hello.py」を作成します。その中には、関数「hello」と「good_morning」が含まれます。
構成
┣ main.py (実行ファイル)
┗ hello.py (モジュールファイル:関数helloとgood_morningを含む)
def hello(s):
print("Hello, {}!".format(s))
def good_morning(s):
print("Good morning, {}!".format(s))
モジュール名でインポートする
モジュール名で呼び出すと、関数を「モジュール名.関数」で使えます。
import hello
hello.hello("Naoko")
hello.good_morning("Ken")
$ python main.py Hello, Naoko! Good morning, Ken!
関数を指定してインポート
「from モジュール名 import 関数」で呼び出すと、直接、関数名で使えることができます。その場合、インポートしていない関数は使えません。
from hello import hello
from hello import good_morning
hello("Naoko")
good_morning("Ken")
$ python main.py Hello, Naoko! Good morning, Ken!
モジュール内のすべての関数をインポート
「from モジュール名 import *」で指定したモジュールの関数を関数名だけで使えるようになります。でも、こうして呼び出すと、このコードを見ただけでは、どのモジュールの関数なのか、よくわからなくなり、可読性も低下する上、下手すると同じ名前の変数や関数があった場合、上書きをしてしまいバグの温床となってしまうため、使うことは推奨されていないようです。
from hello import *
hello("Naoko")
good_morning("Ken")
$ python main.py Hello, Naoko! Good morning, Ken!
自作モジュールの使い方:その2 パッケージ化する
実行ファイルと同じ階層にディレクトリを置いて、その中に「__init__.py」を置くことで、ディレクトリのモジュールしてみなし、モジュールの実体をディレクトリの中に入れる「パッケージ化」をすることができます。
構成
┣ main.py (実行ファイル)
┗ /greeting
┣ __init__.py
┗ bye.py
「__init__.py」にモジュール本体を記述し、パッケージをインポート
「__init__.py」にモジュール本体を記述することにより、ディレクトリ名をモジュール名として呼び出すことができます。
def hello(s):
print("Hello, {}!".format(s))
def good_morning(s):
print("Good morning, {}!".format(s))
import greeting
greeting.hello("Naoko")
greeting.good_morning("Ken")
$ python main.py Hello, Naoko! Good morning, Ken!
「__init__.py」にモジュール本体を記述し、関数を指定してをインポート
その1のケースと同様に、関数を指定してインポートすると、直接関数名で使えるようになります。
from greeting import hello
from greeting import good_morning
hello("Naoko")
good_morning("Ken")
$ python main.py Hello, Naoko! Good morning, Ken!
パッケージの中に複数のモジュールを置く
パッケージの中に複数のモジュールを入れることもできます。その場合、「__init__.py」はディレクトリがパッケージであることを示すために、空ファイルでもよいので、作っておく必要があります。(前の例にように具体的な働きを持たせて構わないようです。)
その場合、下記のように「from ディレクトリ名 import モジュール名」でインポートして、「もじゅ^る名.関数」で使うことができます。
def good_bye(s):
print("Good bye, {}!".format(s))
def good_night(s):
print("Good night, {}!".format(s))
from greeting import bye
bye.good_bye("Naoko")
bye.good_night("Ken")
$ python main.py Good bye, Naoko! Good night, Ken!
パッケージの中に複数のモジュールを置く(関数を指定してインポート)
同様に「from ディレクトリ名.モジュール名 import 関数」で、関数を指定してインポートできます。
from greeting.bye import good_bye
from greeting.bye import good_night
good_bye("Naoko")
good_night("Ken")
$ python main.py Good bye, Naoko! Good night, Ken!
コメント