Pythonで自作モジュール,パッケージを使いこなす

スポンサーリンク
Python基礎
スポンサーリンク

モジュールやパッケージの使い方をまとめました。自作モジュールは大きなプログラムを書く上で重要になります。また、標準モジュールや配布されているスクリプトの理解にも非常に重要な知識です。

自作モジュールの使い方:その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!

参考リンク

Python基礎
スポンサーリンク
鷹の目週末プログラマー

コメント