Pythonには複数のモジュールを束ねて扱うための「パッケージ」という仕組みがある。その作り方、インポート方法などについて見ていこう。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
* 本稿は2019年7月9日に公開された記事を、Python 3.12.0で動作確認したものです(確認日:2023年11月10日)。
前回と前々回は、モジュールについて見た。今回は、モジュールを束ねて1つの単位として扱えるようにする仕組みである「パッケージ」について見ていこう。
モジュールとは基本的には「Pythonのコード(再利用可能な関数の定義など)を含んだテキストファイル」のことだ。「パッケージ」とは、複数のモジュールを束ねたものだと考えられる。普段、コンピュータを使っていると、「ファイル」とそれを階層的に管理するための「フォルダ」を頻繁に目にするが、モジュールはファイルに対応し、パッケージはフォルダに対応するものと考えると分かりやすいだろう*1。
実際、Pythonでは多くの場合、パッケージはモジュールをフォルダに格納する形を取る。
*1 ただし、Pythonのドキュメント「インポートシステム」には「パッケージやモジュールはファイルシステムから生まれる必要はないので、この比喩を額面通りに受け取ってはいけません」とあることも覚えておこう。
通常のファイルとフォルダがそうであるように、モジュールとパッケージは2層以上の階層構造を形成することもある。そのようにすることで、ライブラリが大規模になったときに、ライブラリを構成するモジュール(ファイル)群を整理できるようになる。
また、「mypkgパッケージのmymoduleモジュール」は「mypkg.mymodule」のように、ドット「.」を使用してパッケージ名とモジュール名をつないで表記する。階層が深くなり、「mypkgパッケージのmysubmodサブモジュールのmodule1モジュール」であれば「mypkg.mysubmod.module1」のように表記する。さらにそれらの属性はもちろんドットでつないで表記する。
以下では、1つのフォルダと2つのモジュールで構成されるシンプルなパッケージを作ってみよう。
ここでは以下の2つのモジュールで構成される「mypkg」パッケージを作成してみよう。
これらのファイルを「mypkg」フォルダに格納すれば、それだけでmypkgパッケージとなるわけではない。Pythonでは、基本的にはモジュールを含んだフォルダに以下のファイルを配置することで、それがモジュールとして扱われるようになる。
シンプルなパッケージであれば、__init__.pyファイルがありさえすればよい。しかし、パッケージのインポート時に何らかの初期化処理が必要になるのであれば、このファイルにそれらの処理を記述する。
よって、mypkgパッケージの構造は次のようになる。
以下ではこれら3つのファイルを作成して、Jupyter Notebook上のPython環境にパッケージを作成していこう。
前回はセルに入力した内容をダウンロードして、それをモジュールとしてアップロードしていたが、今回はJupyter NotebookのPython環境(Webブラウザの中)だけでファイルを作成/編集してみよう(こちらの方が簡単だ)。ただし、その前に3つのファイルを保存して、パッケージの入れ物となるフォルダを作成する必要がある。
これには[File]メニューから[Open]を選択して、次のページを表示する。
このページの右上に[New]ボタンがある。これをクリックすると、ドロップダウンが開くので、そこから[Folder]という項目を選択する。
すると、[Untitled Folder]というフォルダがファイル一覧に表示される。
次にフォルダ名を変更する。これには、[Untitled Folder]の左に表示されているチェックボックスをチェックして、その上にある[Rename]ボタンをクリックする。
すると、ダイアログが表示されるので、「mypkg」と入力して、[Rename]ボタンをクリックする。
これにより、[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
コードを入力したら、[File]メニューの[Save]を選択する。
これでmymathモジュールの作成と編集は完了だ。次に同様の手順で、greetモジュール(greet.py)を作成する。コードは以下の通りだ。
def hello(whom):
return 'Hello ' + str(whom)
こちらには上に示したhello関数を1つだけ定義しておこう。
最後に同じ手順で「__init__.py」ファイルを作成しておく。これについては、今のところはファイルを新規作成して、名前を「__init__.py」に変更しておくだけでよい。
これでパッケージの作成は完了だ。次に、このパッケージをインポートしてみよう。
Copyright© Digital Advantage Corp. All Rights Reserved.