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

Python入門:[Python入門]パッケージ (1/2)

Pythonには複数のモジュールを束ねて扱うための「パッケージ」という仕組みがある。その作り方、インポート方法などについて見ていこう。

[かわさきしんじ,Deep Insider編集部]
「Python入門」のインデックス

連載目次

 前回前々回は、モジュールについて見た。今回は、モジュールを束ねて1つの単位として扱えるようにする仕組みである「パッケージ」について見ていこう。

パッケージとは

 モジュールとは基本的には「Pythonのコード(再利用可能な関数の定義など)を含んだテキストファイル」のことだ。「パッケージ」とは、複数のモジュールを束ねたものだと考えられる。普段、コンピュータを使っていると、「ファイル」とそれを階層的に管理するための「フォルダ」を頻繁に目にするが、モジュールはファイルに対応し、パッケージはフォルダに対応するものと考えると分かりやすいだろう*1

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

 実際、Pythonでは多くの場合、パッケージはモジュールをフォルダに格納する形を取る。

*1 ただし、Pythonのドキュメント「インポートシステム」には「パッケージやモジュールはファイルシステムから生まれる必要はないので、この比喩を額面通りに受け取ってはいけません」とあることも覚えておこう。


 通常のファイルとフォルダがそうであるように、モジュールとパッケージは2層以上の階層構造を形成することもある。そのようにすることで、ライブラリが大規模になったときに、ライブラリを構成するモジュール(ファイル)群を整理できるようになる。

階層構造を使って整理されたパッケージ 階層構造を使って整理されたパッケージ

 また、「mypkgパッケージのmymoduleモジュール」は「mypkg.mymodule」のように、ドット「.」を使用してパッケージ名とモジュール名をつないで表記する。階層が深くなり、「mypkgパッケージのmysubmodサブモジュールのmodule1モジュール」であれば「mypkg.mysubmod.module1」のように表記する。さらにそれらの属性はもちろんドットでつないで表記する。

 以下では、1つのフォルダと2つのモジュールで構成されるシンプルなパッケージを作ってみよう。

パッケージを作成する

 ここでは以下の2つのモジュールで構成される「mypkg」パッケージを作成してみよう。

  • mymathモジュール:前回に作成したfact関数/fizzbuzz関数/fib関数/PI変数を定義する(前回は「myutil」というモジュール名だったもの)。Pythonには組み込みのmathモジュールがあるのでここでは「mymath」という名前にしてある
  • greetモジュール:hello関数だけを定義する

 これらのファイルを「mypkg」フォルダに格納すれば、それだけでmypkgパッケージとなるわけではない。Pythonでは、基本的にはモジュールを含んだフォルダに以下のファイルを配置することで、それがモジュールとして扱われるようになる。

  • __init__.pyファイル

 シンプルなパッケージであれば、__init__.pyファイルがありさえすればよい。しかし、パッケージのインポート時に何らかの初期化処理が必要になるのであれば、このファイルにそれらの処理を記述する。

 よって、mypkgパッケージの構造は次のようになる。

mypkgの構造 mypkgの構造

 以下ではこれら3つのファイルを作成して、Jupyter Notebook上のPython環境にパッケージを作成していこう。

フォルダの作成

 前回はセルに入力した内容をダウンロードして、それをモジュールとしてアップロードしていたが、今回はJupyter NotebookのPython環境(Webブラウザの中)だけでファイルを作成/編集してみよう(こちらの方が簡単だ)。ただし、その前に3つのファイルを保存して、パッケージの入れ物となるフォルダを作成する必要がある。

 これには[File]メニューから[Open]を選択して、次のページを表示する。

Python環境のファイルブラウザ Python環境のファイルブラウザ

 このページの右上に[New]ボタンがある。これをクリックすると、ドロップダウンが開くので、そこから[Folder]という項目を選択する。

新規フォルダの作成 新規フォルダの作成

 すると、[Untitled Folder]というフォルダがファイル一覧に表示される。

新規に作成されたフォルダ(赤枠内) 新規に作成されたフォルダ(赤枠内)

 次にフォルダ名を変更する。これには、[Untitled Folder]の左に表示されているチェックボックスをチェックして、その上にある[Rename]ボタンをクリックする。

フォルダ名を変更する フォルダ名を変更する

 すると、ダイアログが表示されるので、「mypkg」と入力して、[Rename]ボタンをクリックする。

新しいフォルダ名を入力する 新しいフォルダ名を入力する

 これにより、[mypkg]というフォルダがファイル一覧に表示される。

[mypkg]フォルダができた [mypkg]フォルダができた

 今度はそのファイル名をクリックして、フォルダを移動しよう。

ファイル名のリンクをクリックして、フォルダを移動したところ ファイル名のリンクをクリックして、フォルダを移動したところ

 この後は、このフォルダ内に3つのファイルを作成していく。

ファイルの編集

 フォルダの作成と同様に、ファイルの作成には、ページの右上にある[New]ボタンを利用する。これをクリックして表示されたドロップダウンから今度は[Text File]を選択してみよう。

テキストファイルの新規作成 テキストファイルの新規作成

 これにより、新たに次のようなページが表示される。

テキストファイルの編集画面 テキストファイルの編集画面

 ここにPythonのコードを入力して、保存すればよいのだが、その前にファイル名を変更しておこう。これには、[File]メニューから[Rename]を選択する。

ファイル名の変更 ファイル名の変更

 これによりファイル名を変更するダイアログが表示されるので、まずは「mymath.py」と入力して、[OK]ボタンをクリックしよう。

新しいファイル名を入力する 新しいファイル名を入力する

 後はPythonのコードを入力するだけだ。mymathモジュールについては、既に述べた通り、前回のmyutilモジュールと同じコードを流用しよう。実際のコードは以下の通りだ。

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

mymathモジュールのコード(mymath.pyファイル)

 コードを入力したら、[File]メニューの[Save]を選択する。

mymathモジュールのコードを記入したところ mymathモジュールのコードを記入したところ

 これでmymathモジュールの作成と編集は完了だ。次に同様の手順で、greetモジュール(greet.py)を作成する。コードは以下の通りだ。

def hello(whom):
    return 'Hello ' + str(whom)

greetモジュールのコード(greet.pyファイル)

 こちらには上に示したhello関数を1つだけ定義しておこう。

greet.pyファイルを作成して、コードを入力したところ greet.pyファイルを作成して、コードを入力したところ

 最後に同じ手順で「__init__.py」ファイルを作成しておく。これについては、今のところはファイルを新規作成して、名前を「__init__.py」に変更しておくだけでよい。

__init__.pyファイルを作成したところ。中身は空でよい __init__.pyファイルを作成したところ。中身は空でよい

 これでパッケージの作成は完了だ。次に、このパッケージをインポートしてみよう。

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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