スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

【Python】パッケージでモジュールを管理する【入門第44回】

152, 2019-09-04

目次

パッケージとは?

こんにちは、narupoです。

今回はPythonのパッケージを解説します。
パッケージは、前回やったモジュールを管理する仕組みです。
コードをモジュールに分割して、さらにそのモジュールをパッケージで管理するというのが、Pythonのプログラミングにおけるスタンダードです。

パッケージとは簡単に言えばフォルダ(ディレクトリ)のことです。
フォルダ(パッケージ)にファイル(モジュール)を入れて管理する。
これがパッケージの正体です。

パッケージについて、具体的には↓を見てきます。

  • パッケージの作り方
  • パッケージのインポート方法

パッケージを使えるようになると、Pythonで小規模以上のアプリも作れるようになります。
この記事で覚えちゃいましょう。

パッケージの作り方

パッケージとはモジュールの集まりです。
パッケージを作るには、まずパッケージの名前を決める必要があります。
これは、そのパッケージに適した名前を付けます。

今回はサンプルとして「桃太郎」をテーマにしたパッケージを作りたいと思います。
よってパッケージ名はmomotaroとします。

はい、プロジェクトにmomotaroフォルダを作りましょう。

momotaroパッケージを作成

これでmomotaroパッケージの作成がスタートしました。

__init__.pyファイルを配置する

次に、先ほど作成したmomotaroフォルダの中に__init__.pyファイルを作ります。
このファイルは「このフォルダはパッケージだよ」ということをPythonインタプリタに教えてあげるファイルです。
べつに無くても良いのですが、Pythonインタプリタはこのファイルをインポートの時とかに使うことがあります。
なのでパッケージ内のファルダには、この__init__.pyファイルを配置するのがお約束になっています。

めんどくさいですが、配置しておきましょう。

__init__.pyファイルをmomotaroパッケージ直下に作成

パッケージの中にモジュールを配置する

次にパッケージの中にモジュールを配置します。
桃太郎の物語に関する機能をまとめるモジュールとして、storyモジュールを作りたいと思います。
これはmomotaroフォルダの直下に配置します。

storyモジュールを作成

stroyモジュールには↓のような機能を作ります。

# momotaro/story.py

def intro():
    print('''\
むかしむかし、おじいさんとおばあさんが山奥に住んでいました。
おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました。\
''')

これでstoryモジュールを作れました。
あとは桃太郎には動物も出てくるので、animalsというフォルダを作って、その中に動物のモジュールを作ろうと思います。

animalsフォルダの作成

もちろんanimalsフォルダの中にも__init__.pyファイルを配置します。

動物は猿、犬、キジですね。
↓のようにモジュールを配置します。

monkey, dog, kijiモジュールを作成

この内、猿に↓の機能を。

# momotaro/animals/monkey.py

def shout():
    print('ウッキー!')

犬に↓の機能を。

# momotaro/animals/dog.py

def wanwan():
    print('わんわん')

キジに↓の機能を設けます。

# momotaro/animals/kiji.py

def fly():
    print('飛びます飛びます!')

以上で、momotaroパッケージの作成は完了です。
あとはこれを使ってみましょう。

パッケージのインポート方法

momotaroパッケージを利用する方法です。
↓のようにscript.pyからmomotaroパッケージを利用する方法です。

script.pyからmomotaroパッケージを利用する

パッケージは、モジュールのインポートのようにインポートすることができます。
たとえば、storyモジュールを利用したい場合は↓のようにします。

import momotaro.story

↑これでstoryモジュールをインポートすることが出来ました。
↓のようにしてintro関数を呼び出すことができます。

import momotaro.story

momotaro.story.intro()

↑のコードの実行結果は↓のようになります。

むかしむかし、おじいさんとおばあさんが山奥に住んでいました。
おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました。

momotaro.storyは長いので、↓のようにしてfromを使ってstoryのみをインポートして短くします。

from momotaro import story

story.intro()

あとは、animals以下のモジュールも↓のようにして使うことができます。

from momotaro.animals import monkey, dog, kiji

saru.shout()
dog.wanwan()
kiji.fly()

↑のコードの実行結果は↓のようになります。

ウッキー!
わんわん!
飛びます飛びます!

このように、パッケージとはモジュールの集まりなので、インポートして使うことができます。
モジュールが増えてくるとこういったパッケージという単位で管理したほうが効率的に管理できるようになります。

*でモジュールをまとめてインポートする

animalsフォルダ以下のモジュールを全てインポートしたくなっときに、↓のようにしてアスタリスク(*)でインポートしたくなります。

from momotaro.animals import *

saru.shout()
dog.ote()
kiji.fly()

しかし、↑は↓のようなエラーになります。

Traceback (most recent call last):
  File "script.py", line 3, in <module>
    saru.shout()
NameError: name 'saru' is not defined

デフォルトでは、フォルダのモジュールはアスタリスクで一括して読み込むことはできないようになっています。
モジュールはファイルですから、たとえばモジュールが1000個あったら1000個分のファイルを読み込まなければいけなくなります。
そうなるとファイルの読み込みに時間がかかってプログラムの動作が遅くなったりなどの不具合が出るようになります。
そのため、デフォルトではそのような取り込みはしないようになっています。

アスタリスクで一括してモジュールを読み込みたい場合は、__init__.pyに設定を書きます。
animalsのモジュールを一括して読み込みたいので、animals/__init__.pyに↓のように設定を書きます。

__all__ = ['monkey', 'dog', 'kiji']

__all__変数に↑のように読み込みたいモジュール名を書きます。
これで先ほどのコード↓を実行すると、

from momotaro.animals import *

saru.shout()
dog.ote()
kiji.fly()

↓のように実行できます。

ウッキー!
お手!
飛びます飛びます!

Pythonインタプリタは↓のインポート文を実行するときに、

from momotaro.animals import *

animals__init__.pyを参照します。
そこに書かれた__all__の設定に従って、モジュールを読み込むということですね。

おわりに

パッケージの概念は小規模以上のプロジェクトで必須の概念です。
これがないと小規模以上のプロジェクトで地獄を見るでしょう

破滅に向かって突き進め!

死の行進、デスマーチだー!

パッケージが必要になったらまたこの記事を見てみてください。
以上、次回に続きます。

また見てね

関連動画

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク