Python モジュールとパッケージ

Python学習【365日チャレンジ!】66日目のマスターU(@Udemy11)です。

昨日までは、制御フローやコードの構造に関するセクションを学習していましたが、今日から新しいセクションの【モジュールとパッケージ】に入ります。

ほんとこういうところは、具体的にどのようにつかうのかイメージできないまま学習していると嫌気がさしてくるないようなんですよね。

一つ一つが重要なのはわかるのですが、気持ち的には早く具体的な使い方が知りたくなります。

ただ、目的もなく一からPythonを学習するとこのあたりで挫折してしまうと思うんです。

なので、余裕があるのなら、なにか作りながら基礎を学習したほうがモチベーションを継続できるかもしれません。

わたしの場合は、ある意味自分のための辞書用という意味合いも含めてこのPython学習【365日チャレンジ!】を記事にしているので、モチベーションをキープしつつ、毎日楽しくPython学習を継続できています。

それでは、今日もPython学習をすすめていきましょう!

昨日の復習

昨日は、ユーザー定義例外を学習しました。

プログラムの開発をすすめる上で、組み込み例外ではなく、独自の例外を作りたいときに役立つのがユーザー定義例外でした。

Exceptionの中にユーザー定義の例外を作成し、raise文でエラーを呼び出しました。

class UpperError(Exception):
    pass

def check_word():
    words = ['Apple watch', 'Apple TV', 'AIRMAC']
    for word in words:
        if word.isupper():
            raise UpperError(word)

try:
    check_word()
except UpperError as exc:
    print("It's my Exception : {}".format(exc))
else:
    print('Done')

出力結果

It's my Exception : AIRMAC

組み込み例外の処理と組み合わせて使えば、結構プログラミングっぽくなってきた感じがしました。

詳しくは昨日のエントリーをご覧になってください。

それでは今日のPython学習にはいりましょう!

モジュールとパッケージ

モジュール(module)って言葉を聞くと、プログラミングっぽい感じがするのは私だけでしょうか?

これまでは、Pythonの基本から、データ構造や制御フローやコード構造について学習してきたので、一つ一つの部品をみてきた感じです。

これからは、その部品を組み合わせた部品であるモジュールをさらに詰め込んだパッケージの使い方を学習していきますが、その前に、パッケージとモジュールを簡単に理解しておきましょう

関数やクラスを記述したPythonファイル(.py)がモジュールで、そのモジュールをまとめたものがパッケージ、そして、パッケージをまとめてインストールして使えるようにしたものがライブラリです。(基本、標準ライブラリはモジュール)

イメージ的には次のような感じです。

Python モジュール パッケージ ライブラリの関係図

ライブラリはまだ学習していませんが、はじめの頃にちらっと学習したmathpandasmatplotlibなどのサードパーティーライブラリの名前を目にしたことはあるかと思います。

文房具に例えるなら、鉛筆や消しゴムがモジュールで、筆箱がパッケージ、習字セットやノートや筆箱が入ったランドセルがライブラリといったところでしょうか。

Python ライブラリ

Pythonistaでモジュール操作

酒井さんの講座では、Pycharmを使って解説していますが、もちろんPythonistaでも同じ操作が可能です。

今回は、パッケージ内のモジュールをパケージ外のモジュールから読み込んで操作しますが、その行程は次のとおり

  • sessionフォルダを作り、その中にlesson.pylesson_packageフォルダを作る
  • lesson_packageディレクトリの中にutils.py__int__.pyを作成する
  • utils.pyに関数say_wordを定義する
  • lesson.pyからutils.pyをインポートしてsay_wordを実行する

一連の流れはこのような感じです。

ディレクトリの階層はこのようになっています。

session ┳ lesson.py
     ┗ lesson_package ┳ utils.py
                   ┗ __int__.py

まずは、sessionフォルダを作ってその中にlesson.pylesson_packageを作ります。

Pythonistaのホーム画面左下の【+】をタップして、新規フォルダとスクリプトを作成します。

Python モジュールとパッケージ

Python モジュールとパッケージ Pythonista

まずは、sessionフォルダを作成した後、その中にフォルダとスクリプトを作成します。

Python モジュールとパッケージ Pythonista

同じようにlesson_packageフォルダの中にutils.py__int__.pyを作成します。

Python モジュールとパッケージ Pythonista

これで準備が完了です。

ちなみに、__int__.pyは、パッケージ内のモジュールを読み込むときに最初に読み込まれるファイルで、中身は何もなくても必ず作成する必要があります。

utils.pyのコード

lesson.pyからlesson_package内のutils.pyを読み込みますので、まずは、utils.pyのコードを書きます。

utils.py

def say_word(word):
    return (word + '!' ) * 2

引数word!をつけて、2回繰り返す値を返り値にしています。

lesson.pyからutils.pyを読み込む

次に、lesson.pyから同じ階層にあるlesson_package内のutils.pyを読み込んで関数say_wordを実行して値を取得、出力します。

lesson.py<

import lesson_package.utils

r = lesson_package.utils.say_word('Hello')
print(r)

出力結果

Hello!Hello!

イメージとしては、よく使う動作をモジュールにして、使い回すという感じです。

数学で言うところの公式みたいなものですね。

数学の公式は、普遍な計算をより早くできるように簡略化してわかりやすくしたものなので、公式を使うことで時間を短縮することができます。

同じように、モジュールも決まった動作をさせるパッケージを用意することで、いちいちコードを書く必要をなくしているわけです。

fromでコードを短く

importを使うとモジュールを読み込めるわけですが、モジュール内の関数を使うときはコードが長くなってしまいます。

そんなコードを短くできるのがfromを使ったモジュールの読み込みです。

#import lesson_package.utilsの代わりに下のコードを使う
from lesson_package import utils

r = utils.say_word('Hello')
print(r)

出力結果

Hello!Hello!

fromを使うことで、関数を呼び出すときにパッケージ名を省略することができます。

さらに、fromのあとに.utilsを加えた場合、関数名say_wordだけで関数を実行できるようになります。

from lesson_package.utils import say_word

r = say_word('Hello')
print(r)

ただ、この書き方になると、どこのモジュールのsay_wordなのかわからなくなるので、fromを使うときは、パッケージ名までにしておいたほうがいいとのことです。

asでコードを短く

さらに便利なのが、asを使ったやり方です。

import lesson_package.utils as ut

r = ut.say_word('Hello')
print(r)

lesson_package.utilsutに代入しているようなものなので、utils.py内の関数say_wordを実行するには、ut.say_wordだけで実行できるようになります。

ただ、このasを使う場合も、省略しすぎると、自分以外の人にはどのモジュールを使っているのかわかりづらくなるので、使うときは注意が必要です。

プログラムの醍醐味

他のモジュールやライブラリの読み込みは、プログラムの醍醐味と言えるところです。

Pythonの場合、標準ライブラリが充実していて、最初から使える便利なモジュールがたくさんあることが魅力の一つです。

この文言は、Pythonの特徴としてよく目にするのですが、これまではあまり意味がわかっていませんでしたが今回の学習によって、

そういうことか!

と霧が晴れたような感じがしました。

とはいえ、まだまだ五里霧中の感が拭えないので、しっかりと繰り返し、Python学習を続けていきたいと思います。

それでは、明日もGood Python!