Pythonのプログラミングで、別のファイルで作成して書き込んだ関数やパッケージは、別のところにインポートでモジュールとして取り込んで利用することができることをすでに学びました。
インポートとモジュールについてこちらですね。
これを一度復習して欲しいのですが、もちろんこのままでもコードを書いていくことはできるのですが、パッケージ内のモジュールを1つ1つ指定してインポートする場合、たくさんのモジュールを利用する予定であれば、ちょっと手間がかかりますよね。
それはアスタリスク(*)を使うことで楽にすることができます。ただし、一工夫が必要なので、今回はそのあたりを見ていきましょう。また、あまり推奨されてはいない方法であることも頭に入れておきましょう。
複数のモジュールをインポート
それではコードを用意しましょう。importとモジュールを学んだ時と同じファイル構造で見ていきます。
作業ディレクトリをターミナルからlsコマンドで確認するとこうなります。
ここでは、my_moduleとpractice.pyのみを使います。my_moduleフォルダの中には、作業ディレクトリ直下のものとは違うmy_voice.pyとword_shout.pyが入っているのは前回と同じです。(__init__.pyファイルも入っています)
practice.pyを次のコードで実行してみましょう。(モジュール自体のコードは前回の記事で確認してください。)
# from my_module import my_voice, word_shout
from my_module import my_voice
from my_module import word_shout
r1 = my_voice.hello()
r2 = my_voice.study()
s = word_shout.shout("Python")
print(r1)
print(r2)
print(s)
モジュールを2つインポートしています。コメントアウトした1行目のように両方合わせてインポートすることもできますが、見やすさとわかりやすさでそれぞれ指定してインポートしています。どちらでもいいです。
Atomでの実行結果はこうなります。
これ自体はすでに理解できている話ですね。
ここではパッケージ内のモジュールを二つ指定してインポートしました。このパッケージ内のモジュールを指定することなく一度にインポートすることができたらコード量が減りますよね。ここでは2つしか無いのでそれほど手間では無いですが、もっとモジュールが多いといちいち指定するのが大変です。
アスタリスクを使えばいいのだが…
そこで、インポートする時に、アスタリスク(*)を使えばまとめてインポートすることができます。
「from パッケージ名 import *」の形で書くとそれが可能になります。
実際に書き変えてみましょう。
from my_module import *
r1 = my_voice.hello()
r2 = my_voice.study()
s = word_shout.shout("Python")
print(r1)
print(r2)
print(s)
実行するとこうなります。
エラーが出てしまいました。
これには、もうちょっと設定が必要になります。
パッケージ内の__init__.pyの設定
モジュールを作る時に、同じパッケージのフォルダ内に__init__.pyという空のファイルを作ったのを覚えているでしょうか? 忘れていたら前回の内容を確認してみてください。
アスタリスクでまとめてインポートするには、この__init__.pyに、__all__という記述で設定を書き込む必要があります。
ここではパッケージのフォルダ内にmy_voice.pyとword_shout.pyのモジュールがあります。これを__all__にリスト表記で代入するコードを書くことになります。
ここでは次のように__init__.pyに書き込むことになります。
__all__ = ['my_voice', 'word_shout']
保存して、もう一度上のコードを実行してみましょう。
今度はエラーが発生せずに実行できているのがわかります。
こうしてアスタリスクを使えば、まとめてモジュールをインポートすることができるのです。
ここでは自作したモジュールパッケージを見てきましたが、Pythonに含まれている標準モジュールやサードパーティモジュールもアスタリスクで使えるようになっています。
ただしこの方法は、まとめてインポートするとどんなモジュールを取り込んだのかわから無いのであまり勧められていない手法であるとも言われています。
まとめ
Pythonプログラミングで複数のモジュールをインポートする時、一つ一つ指定しなくてもアスタリスクを使えばまとめてインポートできます。
from パッケージ名 import * の形式で記述します。
標準モジュールなどはそのまま利用できますが、自作したモジュールには、パッケージフォルダ内のモジュールと同じ階層に、__init__.pyのファイルを起き、__all__にリストでモジュール名を指定しておく必要があります。
まとめてモジュールをインポートするとコード上では楽ですが、どんなモジュールを取り込んだかわからなくない状況で利用していることになるので、方法としては避けた方が良いとされています。