自作関数のモジュール化
前回、アスタリスク(*)を使ったリストのアンパックを紹介しました。
今回は自作関数のモジュール化について解説していきます。
自作関数に関してはこちらの記事で解説をしていますが、こちらはあくまでも同じプログラム上で関数を定義する方法。
色々とプログラムを書いていると、あっちのプログラムでも、こっちのプログラムでも同じ関数を使うという場面が出てきます。
そんな時はそれぞれのプログラムに自作関数をコピペしてもいいのですが、自作関数をまとめたモジュールを用意して、インポートするというのも手です。
コピペした場合はその後、それぞれのプログラムに合わせて修正しやすい(他のプログラムに影響を与えない)です。
逆にインポートする場合はすべてのプログラムに対して修正した自作関数を使いたい場合は修正が一度で済むので楽というメリットがあります。
チームでプログラミングしている場合はいろいろルールがあるでしょうが、個人でやっている場合はそれぞれのプログラムや自分の性格に合わせて使い分ければいいと思います。
ということで始めていきましょう。
今回は「同じフォルダ内にモジュールファイルを置く場合」と「異なるフォルダ内にモジュールファイルを置く場合」の2つを解説していきます。
同じフォルダ内にモジュールファイルを置く場合
メインのプログラムのファイルを「test1.py」とし、モジュールファイルを「test_module1.py」として同じフォルダに置きます。
import test_module1
a = 1
b = 2
c = test_module1.calc(a, b)
print(c)
def calc(a, b):
c = a + b
return c
これで「test1.py」を実行すると「3」と表示されます。
同じフォルダの場合は「モジュールファイル名.py」の場合は
import モジュールファイル名
でインポートして、
モジュールファイル名.関数名()
で自己関数を使うことができるというわけです。
今回、モジュールファイルの中には自作関数1つしか入れてありませんが、複数入れることも可能です。
またクラスとして定義することも可能です。
クラスに関してはこちらの記事で解説していますので、よかったらどうぞ。
モジュールにクラスを用いた場合の説明用に、メインのプログラムのファイルを「test2.py」とし、モジュールファイルを「test_module2.py」として同じフォルダに置きました。
import test_module2
a = 1
b = 2
tm2 = test_module2.Calc(a, b)
c = tm2.calc()
print(c)
class Calc:
def __init__(self, a, b):
self.a = a
self.b = b
def calc(self):
c = self.a + self.b
return c
コンストラクタの引数に「a」、「b」を定義してみました。
クラスを使った場合はインスタンス化が必要なので、
インスタンス変数 = モジュールのファイル名.クラス名()
としてインスタンス化し、
インスタンス変数.関数名
で関数を使用します。
異なるフォルダにモジュールファイルを置く場合
次にメインのプログラムとは異なるフォルダにモジュールファイルを置く場合です。
この場合は、元々Pythonが読みに行くライブラリやモジュールが保存されているフォルダにモジュールファイルを置く方法とモジュールファイルを置いたフォルダを教えてあげる方法があります。
元々Pythonが読みに行くライブラリやモジュールが保存されているフォルダを確認するには、sysモジュールの「sys.path」を使います。
import sys
print(sys.path)
これを実行し、表示されたフォルダのどれかにモジュールファイルを置いてあげれば他のライブラリやモジュールと同じく「import モジュール名」でインポートできるようになります。
ただこの方法では自作関数に修正が必要となった場合、わざわざ大量のライブラリやモジュールが保存されたフォルダまでいき、修正すべきファイルを探すという手間が増えます。
そのためオススメなのはモジュールファイルをまとめるためのフォルダを作ってそこを参照させる方法です。
これが2つ目の「モジュールファイルを置いたフォルダを教えてあげる方法」です。
例えば今回、メインのプログラム「test3.py」を置いたフォルダ内にさらに「tm3_path」というフォルダを作り、その中にモジュールファイル「test_module3.py」を置きました。
import sys
sys.path.append('./tm3_path')
import test_module3
a = 1
b = 2
c = test_module3.calc(a, b)
print(c)
def calc(a, b):
c = a + b
return c
このように異なるフォルダにあるモジュールファイルを読み込むにはまず
import sys
sys.path.append('モジュールが保存されているフォルダのパス')
としてモジュールが保存されているフォルダのパスをPythonに教えてあげます。
その後は普段ライブラリやモジュールをインポートするようにインポートできます。
ただこの方法はこのプログラム内だけですので、他のプログラムで同じモジュールファイルを使いたい場合は毎回場所を教えてあげる必要があることに注意してください。
ちなみに今回のように一つ下のフォルダの場合は、sysモジュールを使わなくても「from フォルダ名 import ファイル名」でもインポートすることができます。
from tm3_path import test_module3
a = 1
b = 2
c = test_module3.calc(a, b)
print(c)
他のプログラムを作成した時のインポートのしやすさを考えるとどこかに自作のモジュールファイルをまとめたフォルダを作った方が効率的だと思うので、sysモジュールを使った方法を覚えておくことをオススメします。
ということで自作関数のモジュール化でした。
次回からはまた少しいじり始めたJavaScriptの話題にします。
次回はHTML上でJavaScriptを使う方法を解説していきます。
ではでは今回はこんな感じで。
コメント