別のPythonファイルの関数を実行する
開発規模が大きくなってくるとPythonのファイル「.py」を複数に分けて管理する必要が出てきます。例えば以下シチュエーションの場合です。
再利用性: 一度定義した関数を複数のプログラムで再利用できるためコードの重複を避け開発時間を短縮できます。
モジュール性: コードを機能ごとに分割して管理できるためプログラム全体の構造が明確になり理解しやすくなります。
保守性: 修正や機能追加が必要な場合関連するコードが一箇所に集中しているため、変更が容易になります。
名前空間の分離: 別のファイルに関数を分けることで、名前空間を分離し、名前の衝突を避けることができます。
テストの容易さ: 関数が別ファイルに分離されているとその関数単体でのテストが容易になりデバッグ時間を短縮できます。
スケーラビリティ: 機能ごとにファイルを分けることでプログラムの拡張が容易になり大規模なプロジェクトでも管理しやすくなります。

何が書いてあるかがわかりにくいと思うのでノートを事例に書いてみます。
Pythonのプログラムを書くとき、別のノート(.pyファイル)に関数(お手伝いさん)を書いておくといろいろな良いことがあります。ここで言う「別のノートに書く」とは、コンピューターの中で別の場所にコードを保存することを意味します。これが良い理由は次の通りとなります。
何度も使える: お手伝いさんを一度作っておけば何度でも呼び出して使えるので同じことを何度も書かなくていいです。
きれいに整理: おもちゃ箱みたいに関係するものを一緒にしておけばどこに何があるかわかりやすくなります。
直しやすい: もしお手伝いさんのやり方に間違いがあったらその部分だけ直せばいいので、楽に修正できます。
ぶつからない: 名前が同じお手伝いさんがいても、別のノートにいれば混乱せずに済みます。
チェックしやすい: お手伝いさんがちゃんと働くか別でテストできるので問題を見つけやすいです。
大きくできる: たくさんのお手伝いさんがいてもそれぞれが別のノートにいるからうまく管理できます。
実際に2つのPythonファイルを用意して実行してみましょう。
サンプルコード
受け取ったメッセージをコンソールにprintする関数を作ります。以下ソースをvs codeに「msg_test.py」として保存してください。
def print_msg(msgstr):
"""
受け取ったメッセージをprintで表示します。
引数:
msgstr(str): 受け取ったメッセージ
出力:
標準出力に挨拶のメッセージを表示します。
"""
print(msgstr)
############################################
# 関数のテスト
print_msg("こんにちは")
以下のような画面となっていればOKです。

ターミナルへ以下のように入力します。
python msg_test.py
以下のように「こんにちは」と出力されます。

別のファイルから呼び出す。
別ファイル「main.py」ファイルを作成して、以下ソースを貼り付けします。
from msg_test import print_msg # msg_test ファイルから print_msg 関数をインポート
# テストデータ
test_data = "これはテストでメッセージを作成するプログラムです。"
# メッセージを送ってprint_msg関数から出力する。
print_msg(test_data)
以下のような画面となっていればOKです。

ターミナルへ以下のように入力します。
python msg_test.py
以下のような結果になると思います。

「main.py」ファイルの1行目from msg_test import print_msg
の処理で、「msg_test.py」のprint_msg
関数を読み込みして処理できるようにしています。
ここでおかしいのは以下のように関数呼び出ししたにも関わらず「こんにちは」が出力されているところです。

この理由はmsg_test.py読み込みしたときに自動実行される振る舞いをするためです。
これを避けるにはPython では__name__
という特別な変数がありこれは現在のスクリプトの名前を格納します。スクリプトが直接実行されると__name__
は "__main__"
に設定されます。しかし、スクリプトが他のスクリプトからインポートされると__name__
はそのスクリプトのファイル名(拡張子 .py
を除く)に設定されます。
記載してもわかりずらいので、プログラムを直してみましょう。
「msg_test.py」を以下のサンプルコードに変更します。15行目にif __name__ == "__main__":
が追加されただけです。
def print_msg(msgstr):
"""
受け取ったメッセージをprintで表示します。
引数:
msgstr(str): 受け取ったメッセージ
出力:
標準出力に挨拶のメッセージを表示します。
"""
print(msgstr)
############################################
# 関数のテスト
if __name__ == "__main__":
print_msg("こんにちは")
この状態で「main.py」を実行すると以下の通りとなります。

ですので、関数を作成してテストを行う場合にはif __name__ == "__main__":
を入れてテストすることをお勧めします。
importの書き方を変える
「main.py」でimportを書きましたが以下のように変更することも可能です。
この場合1行目は「msg_test.py」すべてをimportするという意味となり7行目でmsg_test.print_msg(test_data)
というようにprint_msg
関数を指定して呼び出ししています。この書き方のメリットは1つの.pyファイルの中にある複数の関数を利用したい場合に便利となります。
import msg_test # msg_test インポート
# テストデータ
test_data = "これはテストでメッセージを作成するプログラムです。"
# メッセージを送ってprint_msg関数から出力する。
msg_test.print_msg(test_data)
最後に
以上が別ファイルのPythonファイルの関数を実行する例となります。いろいろな関数を組み合わせてプログラムを作成する場合に必須の考え方となりますので覚えておいてください。
コメント