Pythonには、プログラムで利用する関数などの部品を分類してまとめておいて、外部のプログラミングファイルにそれを取り込んで使う仕組みがあります。
この部品の集まりをモジュールやパッケージと言います。
このモジュールを取り込むための「import」「from」といったキーワードを使います。
ここではモジュールとインポートについて触れていきましょう。
モジュールを作る
モジュールをインポートしてプログラミングに利用するということですから、簡単なコードでモジュールを作ってみましょう。
作業しているディレクトリの中に、Pythonファイルを作ります。ここではmy_voice.pyとword_shout.pyいうファイル名の2つのファイルを作成してみます。
my_voice.pyはこちらのコードにしました。
def hello():
return "Hello! Python!"
def study():
return "ただいまPythonの勉強中!"
挨拶と勉強中!と返す関数を書いています。
word_shout.pyはこちらのコードにしました。
def shout(word):
return (word + "! ") * 3
引数に言葉を入れて、それを3回返す関数を書いています。
ここまでは特に問題無いと思います。
パッケージを作る
モジュールはパッケージとして一つにまとめて、階層構造を作ることができます。
ここで作業ディレクトリに新たにフォルダを作ってみます。ここではフォルダ名をmy_moduleとしました。
このmy_moduleフォルダの中に新しくPythonファイルを用意して関数を書いてもいいのですが、ここでは上の2つのファイルをコピーして、こちらのフォルダの中に入れます。
そのままでもいいのですが、区別をつける為にちょっとだけそれぞれのコードを変えておきます。
my_module/my_voice.pyはこうしておきます。
def hello():
return "Hello! Python module!"
def study():
return "ただいまPythonモジュールの勉強中!"
my_module/word_shout.pyはこうしておきます。
def shout(word):
return (word + "!!! ") * 4
特に難しいところは無いですね。
このmy_moduleというフォルダは、ファイルが2つ入ったパッケージになります。これをPythonでパッケージとしてインポートすることができるように__init__.pyというPythonファイルをフォルダ内に作成します。
my_module/__init__.py
__init__.pyは今は何も記入しなくて構いません。設定を書くことができるのですが、それは別の機会に扱います。パッケージのフォルダに入れて置かないといけないファイルということだけ今は頭に入れておきましょう。
モジュールをインポート
では、モジュールをインポートして使うとはどういうことなのか見ていきましょう。
作業ディレクトリに作業するファイルを用意して、そこにコードを書いていきましょう。ここではpractice.pyというファイル名で作業していきます。
現時点で作業ディレクトリがどんな構成になっているかをターミナルからlsコマンドを使って見てみましょう。
lsコマンドなどターミナルで使うコマンドがわからない場合はこちらを参考にしてください。
作業フォルダの中は次のような形になっています。
__pycache__というものがありますが、一度Pythonを実行するとキャッシュが作成の為にできるものです。ここではとりあえず無視で構いません。作成したファイルとフォルダが確認できますね。もちろんフォルダの中にも作成したファイルが入っています。
では、practice.pyにコードを書いてインポートの方法を見ていきましょう。
モジュールをインポートするには、「import モジュール名」をコードの冒頭に書きます。
まずは最初に作った2つのPythonファイルをインポートしてみましょう。
import my_voice
import word_shout
r1 = my_voice.hello()
r2 = my_voice.study()
s = word_shout.shout("Python")
print(r1)
print(r2)
print(s)
同じ作業ディレクトリにあるモジュール(ファイル名)を指定してインポートしているのがわかります。
このモジュール名に続けて、ドット(.)で接続してモジュール内の関数をそれぞれ呼び出して実行するコードですね。
Atomで実行するとこうなります。
モジュールで定義した関数が、このプログラミングで実行されているのがわかりますね。
次はパッケージ(ここではmy_module)のインポートについて見てみます。1つのモジュールだけインポートしたコードを書いてみます。
import my_module.word_shout
s = my_module.word_shout.shout("Python")
print(s)
importに続けて、パッケージ名を置き、ドット(.)に続けてモジュール名を書いています。
呼び出すには、パッケージ名を置き、ドット(.)に続けてモジュール名を書き、さらにドット(.)に続けて関数を呼んでいます。
実行するとこうなります。
パッケージ内のモジュールの関数が呼び出されているのがわかります。
ただ、これは呼び出すコードがとても長くなりますよね。
このコードは次のようにfromキーワードを使って書き換えることができます。
from my_module import word_shout
s = word_shout.shout("Python")
print(s)
パッケージの中から特定のモジュールをインポートしているコードになります。
呼び出しのコードがモジュール名からになっています。
また、次のようにも書き換えることができます。ただし、この書き方は実際にはやらない方がいいです。
from my_module.word_shout import shout
s = shout("Python")
print(s)
これはパッケージのモジュールから、特定の関数だけをインポートしているコードになります。
今度は呼び出しのコードが関数名だけになっています。この関数だけ呼び出されているのがくせ者です。この場合はコードが単純ですからわかりますが、このコードの中に別にshout()関数を定義しているところに、このモジュールのインポートの方法を行っていると、関数の名前が同じになってバッティングすることになります。
ですから、この最後のインポートの書き方は避けるようにしましょう。
どれも出力の結果は同じになりますが、このようにインポートの書き方で呼び出し方が変わってくることに注意しましょう。どのような書き方をするかは、統一しておくのが良いと思います。
別名でインポート
今度は、このコードを見てみましょう。パッケージに入れたもう1つのモジュールを使ってコードを書いています。
from my_module import my_voice
r1 = my_voice.hello()
r2 = my_voice.study()
print(r1)
print(r2)
実行するとこうなります。特に違うことはやっていません。
パッケージ内のモジュールを使っているのがわかりますね。
ここで、関数を呼び出すのに、モジュール名に繋げて書くのはちょっと長いなと思えたりすることがあります。
このモジュール名はまだいいですが、場合によってはもっと長い名前になってコードの記述が煩雑に感じたりすることがあります。また、この場合のように同じモジュール名を何度も使って呼び出すのもかなり手前になります。
この場合は、インポート時にasキーワードを使ってモジュール名を別名にして簡素な使いやすいものに変えて使うことができます。
このコードを書き換えてみましょう。
from my_module import my_voice as mv
r1 = mv.hello()
r2 = mv.study()
print(r1)
print(r2)
インポート時にmy_voiceをasキーワードにして、mvに変更しています。呼び出しもモジュール名ではなく、この別名を使っています。
実行しても結果は同じです。
このように、モジュール名をわかりやすい別名にすることで利便性を高めることができますし、同じ名前の別のモジュールを使いたい時にもこの書き方で利用することができます。
ただし、あまりこれを多用すると、別名の部分を見ただけでは何のモジュールを使っているのかわからないことにもなるので、使わない方が良いと言われる場合もあります。
インポートする方法のルール
これまでモジュールを作ってインポートをする方法を見てきました。
Pythonにはあらかじめ組み込まれている標準モジュールもあります。
また、サードパーティのモジュールもあります。
これらをそれぞれ使ってプログラミングすることがありますが、インポートする時に書く順番が決められています。守らなくてもプログラミングは動きますが、コードを読んだ時に理解しやすくする為に意識したおきましょう。
適当にモジュールをインポートしたコードを書いてみました。
import calendar #標準モジュール #import calender, os, time
import os
import time
import numpy #サードパーティモジュール
import scipy
import my_module #作成したモジュールパッケージ
import my_voice #ローカルファイル
まず、importに続けて複数のモジュールをカンマで区切って書くこともできますが、これは推奨されていません。
どれもアルファベット順にそれぞれインポートする必要があります。
また、モジュールの種類毎にインポートします。まず標準モジュールをインポートして、1行開けてサードパーティモジュール、1行開けて作成したパッケージ、さらに1行開けてローカルファイルという並びで記述するというルールになっています。
まとめ
Pythonには、プログラムで利用する関数などの部品を分類してまとめておいて、外部のプログラミングファイルにそれを取り込んで使う仕組みがあります。
この部品の集まりをモジュールやパッケージと言います。
パッケージは自分で作ることもできますし、すでに組み込まれた標準モジュールや、サードパーティのモジュールをインストールして使うことができます。
import文でモジュールをインポートします。fromを組み合わせてモジュールを指定してインポートすることもできます。
パッケージをインポートする順番もルールとして決められています。
インポートはプログラミングで常に使うことになりますのでしっかり理解しておきましょう。