連載
» 2019年07月05日 05時00分 公開

Python入門:[Python入門]モジュールの作り方 (1/2)

Pythonでは複数の関数や変数などを「モジュール」にまとめることで、コードの再利用が可能になる。その作り方について見ていこう。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Python入門」のインデックス

連載目次

 前回は、モジュールの使い方について見た。今回は自分でモジュールを作る方法を説明する。

モジュールはプログラムコードを格納したファイル

 前回も述べた通り、モジュールとは「Pythonのコードを含んだ、拡張子がpyのテキストファイル」だ。そのテキストファイルで、例えば関数や変数を定義すれば、(通常は)それらはそのモジュールが「公開」する名前となる。

 例として次のようなコードを考えてみよう。

def fact(x):
    result = 1
    if x == 0:
        return result
    for num in range(1, x + 1):
        result *= num
    return result

def fizzbuzz(x):
    result = str(x)
    if x % 3 == 0 and x % 5 == 0:
        result = 'FizzBuzz'
    elif x % 3 == 0:
        result = 'Fizz'
    elif x % 5 == 0:
        result = 'Buzz'
    return result

def fib(x):
    if x == 0:
        return 0
    elif x == 1:
        return 1
    return fib(x - 1) + fib(x - 2)

PI = 3.14159

自作の関数と定義を含んだPythonコード

 このコードでは3つの関数と1つの変数を定義している。あくまでもこれはサンプルコードなので、これらの関数が何をするものかを深く理解する必要はないが、簡単な説明だけをしておこう。

  • fact関数:引数に指定した数値の階乗を求める(例:fact(5)は1×2×3×4×5=120を戻り値とする)
  • fizzbuzz関数:引数に指定した数値が「3の倍数かつ5の倍数なら'FizzBuzz'」を、「3の倍数なら'Fizz'」を、「5の倍数なら'Buzz'」を、それ以外のときには引数に指定した値(を文字列化したもの)を返す(例:fizzbuzz(15)は'FizzBuzz'を戻り値とする)
  • fib関数:「引数に指定した値」番目のフィボナッチ数を返す。フィボナッチ数とは「初項の値を0、その次の項の値を1」として、それ以降の項の値を「2つ前のフィボナッチ数と1つ前のフィボナッチ数の和」として求められる数列に含まれる数のこと(例:fib(2)なら「2つ前のフィボナッチ数」はfib(0)で表され、「1つ前のフィボナッチ数」はfib(1)で表される。よって、fib(2)= fib(0)+fib(1)であり、この場合は「0+1」の和である「1」が戻り値となる)

 以下では、これらの3つの関数と(名前が全て大文字でつづられていることから定数としての使用を前提とした)変数PIを含んだモジュールを作ってみよう。

3つの関数と1つの変数(定数)を含んだモジュール 3つの関数と1つの変数(定数)を含んだモジュール

 モジュールを作成した後は、それをインポートすることで、いつでも上で定義した関数や変数を利用できるようになる。

モジュールを作成する

 既に述べた通り、Pythonのモジュールとは「Pythonのコードを含んだ、拡張子がpyのテキストファイル」である。ここでは先ほどのモジュールを「myutil.py」という名前のファイルに保存することにする。モジュール名としては、拡張子部分を取り除いて、「myutil」モジュールと呼ぶ*1

 また、Pythonのコーディングスタイルガイドでは「モジュール名は短く、英小文字のみを使用する」(読みやすくなるならアンダースコア「_」を使ってもよい)となっている。モジュール名を付けるときには、これに従うようにしよう(変数名と同じく、モジュールには数字から始まる名前は付けられないので、モジュールを含んだファイル名も数字から始められないことに注意)。

*1 ファイル名に含まれている「util」は「utility」の省略形で、「役立つ道具」のような意味を持つ。つまり、myutil.pyファイルは「あると便利な関数を集めた」モジュールのことだ。


 本連載で取り扱っているWebベースのPython環境であるJupyter Notebookでは、セルに入力した内容を拡張子が「py」のファイルとして保存(ダウンロード)することで、モジュールを作成できる。簡単にその手順を示しておこう。

 まず、新規にPython環境を開き、そこに上述のコードを入力する。

Jupyter NotebookのPython環境でセルにコードを入力したところ Jupyter NotebookのPython環境でセルにコードを入力したところ

 次に[File]メニューから[Download as]−[Python (.py)]を選択する。

セルに入力したコードをダウンロードする セルに入力したコードをダウンロードする

 これで拡張子が「py」のファイルがダウンロードされるので、保存先のフォルダに移動して、ファイル名を「myutil.py」に変更する(以下はWindows環境の例)。

ファイル名を「myutil.py」に変更する ファイル名を「myutil.py」に変更する

 このとき、作成されたモジュールの内容は例えば次のようになっている。

#!/usr/bin/env python
# coding: utf-8

# In[ ]:


def fact(x):
    result = 1
    if x == 0:
        return result
    for num in range(1, x + 1):
        result *= num
    return result

# 以下は省略

ダウンロードしたmyutil.pyファイルの内容

 先頭の2行は第8回「コメント」の「Pythonファイルのエンコーディング宣言」で説明した「シバン行」と「エンコーディング宣言」だ。その後には入力履歴の「In[ ]:」がコメント行として残されている。それ以降は上に示したコードが続く(ので、以下ではfizzbuzz関数以下は省略している)。

 このように、他のプログラムから使用されることを念頭に置いた関数や定数の定義を含んだPythonのコードが「モジュール」だ。これに対して、実際に何らかの処理を行うPythonコードを含んだファイルのことを「スクリプト」ファイルと呼ぶことがある(「スクリプト」とは「脚本」のことで、Pythonが行う処理の手順を「脚本」に見立てた表現だ)。

 テキストエディタなどを使ってPythonのプログラムを作成しているのであれば、単純にそうしたファイルを作成、保存するだけでモジュールが作成される。例えば、以下はVisual Studio Codeと呼ばれるテキストエディタで、上記のコードを含んだ「myutil.py」ファイルを作成しているところだ。

Visual Studio Codeでモジュールを作成しているところ Visual Studio Codeでモジュールを作成しているところ

作成したモジュールを利用する準備

 作成したモジュールは前回に説明したimport文で、現在の環境にインポートできる。といっても、これは前回に見た標準モジュールや、本連載で使用している[Try Jupyter]ページから作成できるPython環境に標準でインストールされているパッケージとは異なり「自作のモジュール」だ。そのため、インポートする前にはPythonがそのモジュールを認識できるようにする準備が必要になる。

 簡単にいえば、[Try Jupyter]ページから作成したPython環境では、その環境に作成したモジュールをアップロードする必要がある。ここではWindows環境を例に取って説明しよう。他のOSでも同様なはずだ。

 [File]メニューから[Open]を選択する。これにより、次のような現在のPython環境を実行している作業フォルダが表示される。

[File]メニューから[Open]を選択する
[File]メニューから[Open]を選択する
現在のPython環境を実行している作業フォルダが表示される
現在のPython環境を実行している作業フォルダが表示される

作成したモジュールをアップロードする(1)


 次にこのページの右上にある[Upload]ボタンをクリックする。すると、ファイル選択ダイアログが表示されるので、作成したモジュールを選択して、[開く]ボタンをクリックする。

[Upload]ボタンをクリックする
[Upload]ボタンをクリックする
ファイル選択ダイアログで、作成したモジュールを選択して、[開く]ボタンをクリックする
ファイル選択ダイアログで、作成したモジュールを選択して、[開く]ボタンをクリックする
ファイルの一覧に「myutil.py」が追加されるので、[Upload]ボタンをクリックする
ファイルの一覧に「myutil.py」が追加されるので、[Upload]ボタンをクリックする
ファイルがアップロードされた
ファイルがアップロードされた

作成したモジュールをアップロードする(2)


 これにより現在のPython環境で、作成したモジュールをインポートする準備が整った。

 一方、テキストエディタなどを使ってmyutilモジュール(myutil.pyファイル)を作成した場合は、そのモジュールを別のプログラムから使用するには、別プログラムと同じフォルダにモジュールを置くのが一番簡単だ。例えば、以下はVisual Studio Codeでmyutilモジュールを利用するプログラムを作成中のところだ。

Visual Studio Codeでモジュールと、それを利用するプログラムを編集しているところ Visual Studio Codeでモジュールと、それを利用するプログラムを編集しているところ

 ウィンドウの左側の[エクスプローラー]の下にmyutilモジュール(myutil.pyファイル)と、これを利用するmain.pyファイルが表示されている点に注目しよう(ウィンドウ右側のタブにも、これら2つのファイルが表示されている)。

 コマンドプロンプトやシェルから「python」とだけ入力して対話環境を開いて、そのモジュールを利用するのであれば、モジュールがあるフォルダで「python」コマンドを入力する。

 実際には、モジュールをインポートする際に、Pythonは「モジュール検索パス」を参照して、指定されたモジュールを探し出すようになっている。これについては後で簡単に触れよう。

 次ページでは、作成したモジュールを実際に使ってみる。

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。