【Python】他のファイルの関数を使う方法を初心者向けに解説
はじめに
Pythonを使ってプログラムを作るとき、他のファイルで定義した関数を呼び出す場面がよくあります。
ひとつのファイルにすべてのコードを書くと、どこに何があるのか分かりにくくなることがあるからです。
ファイルを分けてコードを整理することで、作業効率が上がり、他の人と協力もしやすくなります。
ところが、はじめてプログラミングをする皆さんにとっては、「そもそもファイルを分けるとどうやって関数を呼び出せばいいの?」と感じるかもしれませんね。
ここでは、Python 他のファイルの関数を使う基本的な方法を具体的な例とともにわかりやすく紹介します。
実務に近いシーンも交えながら説明するので、日々の開発に役立ててみてください。
この記事を読むとわかること
- Pythonで他のファイルにある関数を呼び出す仕組み
- 関数を呼び出す際に役立つimportの書き方と注意点
- 実務でよくあるコード分割のメリットと活用シーン
- 関数を呼び出すサンプルコードと基本的な流れ
ファイルを分ける理由とは?
プログラムを大きくしていくと、すべての処理が1つのファイルに詰め込まれてしまう場合があります。
この状態ではコードが長くなりすぎて、修正のたびに探し回ることが増え、間違いに気づきにくくなるでしょう。
そのため、機能ごとにファイルを分割し、必要な関数を呼び出しながら組み立てる方法がよく使われます。
こうすると、同じ処理を何度も書く必要がなくなり、コードの再利用性が高まります。
さらに、誰かとチームで作業するときも、ファイル分割により役割をはっきりさせやすくなるのです。
実務での活用シーン
たとえば、以下のような場合があります。
データ処理の関数だけをまとめる
CSVファイルを読み込んだり、テキストデータを整形したりする機能を1つのファイルに集約すると、他の場所から簡単に呼び出せます。
UIに関する関数をまとめる
画面表示やユーザー入力を処理する部分を別ファイルにすると、見た目の変更があっても他の処理に影響しにくくなります。
便利な共通関数をまとめる
何度も使う計算や文字列処理の関数を、別ファイルに用意しておくことで、繰り返し利用できます。
このように、それぞれの役割に応じてファイルを分割すると、見通しが良くなるだけでなく、後から機能を追加するときも扱いやすくなります。
Python 他のファイルの関数を使う基本的な流れ
Pythonでは、ファイル(モジュールとも呼ばれます)をまたいで関数を使いたい場合、import を使います。
ファイルをA.py、呼び出したい関数を定義したファイルをB.pyとするとき、A.pyでB.pyをimportすることでB.py内の関数を利用できる仕組みです。
たとえば、B.pyに以下のような関数があるとします。
# B.py def greet(name): return f"こんにちは、{name}さん"
上記の関数をA.pyで呼び出したい場合は、以下のようなコードを書きます。
# A.py import B message = B.greet("田中") print(message) # こんにちは、田中さん
import B の部分でB.pyにあるコード全体を読み込み、その後に B.greet() という形で関数を呼び出しているわけです。
注意点
- import文を書いたら、呼び出したい関数を
B.関数名
のように モジュール名.関数名 の形式で使います。 - 同じフォルダ内にB.pyが存在する必要があります。
- Pythonのファイル名と関数名が同じだと、混乱を招きやすいので名前の付け方は工夫すると良いでしょう。
from で特定の関数だけをインポート
先ほどの例のように import B
と書くと、B.pyのすべての関数や変数を読み込む形になります。
しかし、もしB.pyの中で使用したい関数が1つだけであれば、以下のように書く方法も便利です。
# A.py from B import greet message = greet("鈴木") print(message)
この場合、greet
という名前で直接呼び出せるので、モジュール名を付ける必要はありません。
ただし、B.pyに同名の関数や変数が複数ある場合は重複に注意が必要です。
実務ではどちらを使う?
import B
B.pyの多くの機能をまとめて扱う場合に便利です。モジュールを識別しやすいので、どこから呼び出しているかが明確になります。
from B import greet
特定の関数だけ使いたい場合に便利です。呼び出しコードがシンプルになります。
使い分けはプロジェクトの規模やコーディング規約によって変わりますが、「どこからコードをインポートしているか分かりやすいか」を基準に考えるとよいでしょう。
相対パスと絶対パス
Pythonでは、ファイルが複数のフォルダに分かれている場合、相対パスや絶対パスを使ってインポートすることがあります。
大規模なプロジェクトだとフォルダ階層が深くなるため、下記のような形でインポートを使い分けることが多いです。
from .B import greet # 相対インポート(同じフォルダ階層ならドットを使う)
from mypackage.B import greet # 絶対インポート(mypackage というフォルダ名)
よくある実務シーン
- 大規模プロジェクトでは、チーム全体で階層構造を決めておき、それに沿ってモジュールを整理します。
- 相対パスを使うときは、ドットの数が増えてわかりにくくならないよう、フォルダ構造を深くしすぎない工夫が必要です。
- 絶対パスを使うときは、パッケージ名のつづりや階層を間違えるとエラーになりやすいため、プロジェクト内で共通のルールを定めておくと安心です。
実際のファイル構成例
では、もう少し具体的な例を見てみましょう。
以下のようなフォルダ構成だとします。
my_project/ ├─ main.py ├─ helpers/ │ └─ string_helpers.py └─ data/ └─ math_helpers.py
main.py
:メインとなる処理が書かれたファイルhelpers/string_helpers.py
:文字列関連の関数を集めたファイルdata/math_helpers.py
:計算処理に関する関数をまとめたファイル
この場合、たとえば string_helpers.py
に以下のような関数を定義します。
def upper_text(text): return text.upper()
そして main.py
で呼び出すときは、以下のように書くことが多いです。
# main.py from helpers.string_helpers import upper_text def run(): result = upper_text("hello world") print(result) run()
別の計算処理を行いたい場合は、math_helpers.py
の関数を同様にインポートします。
# main.py from data.math_helpers import add_numbers def run(): total = add_numbers(3, 5) print(total) run()
このように、役割ごとにファイルを分けておけば、「どこに何があるのか」が分かりやすくなるので、保守や拡張も楽になります。
名前の衝突に気をつける
ファイルを分割するときには、関数名や変数名が重複しないように注意が必要です。
違うファイルに同じ名前の関数があると、importの仕方によっては実行時に「どちらの関数を呼び出しているのか」混乱することがあります。
解決策
ファイル(モジュール)側で名前を変える
例:greet
のバリエーションとして say_hello
や greet_person
のように意図がわかる名前を採用する
import するときに別名を付ける
例: from B import greet as greet_user
こうするとコード内で使うときは greet_user("田中")
のようになります。
特に、大規模プロジェクトでは似たような関数が複数登場することがあるので、名前付けは慎重に行うことが大切です。
実務で役立つポイント
分割したファイルを管理するとき、次の点に気を配るとスムーズに作業できます。
役割ごとにディレクトリを作成して整理する
文字列処理なら文字列用のフォルダ、データ処理ならデータ用のフォルダなど、ファイルを明確に分類するとチーム全体で見通しが良くなります。
ファイル名は役割をイメージしやすくする
util.py
のように抽象的な名前だと、中身が何の機能を提供しているか分かりにくいことがあります。
できるだけ具体的なファイル名を付けるといいでしょう。
バグ発生時の切り分けがしやすい
たとえば、文字列変換に問題が起きたときは string_helpers.py
を中心に調べればいいというように、場所がすぐに特定できます。
ファイルを分割するときは、どのような粒度(どこまで細かく分けるか)にするのか検討することが重要です。
大まかな単位で良い場面もあれば、複数人で作業する関係で小分けが望ましい場面もあります。
コード例:他のファイルで定義した関数を呼び出す流れ
ここではごくシンプルな例を示します。
1つの関数を別ファイルに用意し、メインファイルで呼び出すだけの流れです。
step1:関数を定義するファイル
まずは my_function.py
というファイルを作り、以下のように書きます。
def greet_user(user): return f"{user}さん、こんにちは"
step2:メインファイルでインポートして呼び出す
次に main.py
を作り、関数を呼び出します。
from my_function import greet_user def run(): greeting = greet_user("佐藤") print(greeting) run()
このような構成にしておけば、コードが増えても my_function.py
にある関数を他のプログラムから簡単に呼び出せます。
実務でよくあるエラー例
他のファイルの関数を呼び出そうとしたときに起きがちなエラーをいくつか挙げてみます。
エラーが出ても慌てずに、ファイルの場所やパスの指定が正しいかどうかをチェックしましょう。
ModuleNotFoundError
No module named 'my_function'
といったメッセージが出ることがあります。
これはインポート先のファイルが見つからない場合によく起こります。
フォルダ構成やファイル名を再確認してみてください。
ImportError
cannot import name 'greet_user' from 'my_function'
などと表示される場合があります。
my_function.py
側に関数のスペルミスがないか、あるいは __init__.py
の有無が影響していないかチェックするといいでしょう。
複数のフォルダにわたってファイルを配置しているときは、パスの扱いに注意が必要です。
フォルダを移動するとインポート元のパスも変えなければいけないことがあるので、リファクタリングの際には一括置換などを活用してミスを防ぎましょう。
まとめ
ここまで、Python 他のファイルの関数を呼び出す基本的な方法を解説しました。
ポイントをまとめると、次のようになります。
- import 文を使って別のファイルに定義された関数を呼び出す
- すべてをまとめて呼び出すなら
import ファイル名
、特定の関数だけ呼び出すならfrom ファイル名 import 関数名
- 大規模プロジェクトではファイルやフォルダをわかりやすく分割しておくと保守・拡張が楽になる
- エラーが起きたときはファイル名やパスが正しく指定されているか再確認する
実務の現場では、複数ファイルに分割しながらコードを再利用する場面が多いです。
特に、大きな開発チームでは誰がどこを担当するのか明確に分けるためにも、機能単位でファイルを整理することが効果的です。
最初は少しややこしく思えるかもしれませんが、ファイル分割を意識してプログラムを書くことはコードの管理をずっと楽にしてくれます。
ぜひ皆さんも、複数ファイルに分割したプロジェクトにチャレンジしてみてください。