INDEX
fromの概要
| モジュールなどから特定の要素をインポート Python予約語 | ||
|
from 概要 わかりやすく説明 |
||
|
fromの考え方をイメージで理解

fromの基本的な使い方
数学計算の道具箱である math モジュールから、平方根(ルート)を計算する sqrt 関数だけを指名して取り出す例です。
# from を使った部分的なインポート
from math import sqrt
# math.sqrt(16) と書かずに、直接 sqrt() で使えます
result = sqrt(16)
print(result) # 結果: 4.0
from math import sqrtと記述することで、mathという大きな道具箱の中からsqrtという1つの道具だけを取り出します。
複数の要素をインポート
1つの道具箱からいくつかの道具をまとめて持ってきたい場合は、カンマ , で区切って並べます。
# 複数の要素を同時にインポート
from math import sqrt, pow
result1 = sqrt(25) # 平方根(ルート)
result2 = pow(2, 3) # 2の3乗(累乗)
print(result1, result2) # 結果: 5.0 8.0
エイリアス(別名)を使ったインポート
取り出した機能の名前が長すぎる場合や、自分のコード内の別の変数名と被りそうな場合は、as を使ってあだ名を付けることができます。
# as を使ってあだ名を付ける
from math import sqrt as square_root
# square_root という名前で呼び出せるようになります
result = square_root(9)
print(result) # 結果: 3.0
【比較】from を使わないモジュール全体のインポート
from を使わず、import 単体でモジュールを読み込んだ場合の動きです。
# モジュール全体をそのままインポート
import math
# 使用するときは、必ず「モジュール名.機能名」の形で書く必要があります
result = math.sqrt(36)
print(result) # 結果: 6.0
- この書き方の場合、どの道具箱の機能を使っているのかが一目で分かりますが、何度も同じモジュール名を書く必要があるためコードが長くなりがちです。
全ての要素を丸ごとインポートするワイルドカード(非推奨)
アスタリスク * を使うと、そのモジュール内のすべての機能を一括でインポートして直接呼び出せるようになります。しかし、実務では原則非推奨とされています。
# 【非推奨】すべての要素を一括インポート
from math import *
result = sqrt(49) # 確かに直接使えますが...
print(result) # 結果: 7.0
fromの注意点
- 名前の衝突(競合)に注意する:
fromを使うとモジュール名を書かずに直接関数を呼び出せるようになりますが、もし自分が定義した変数や関数と全く同じ名前のものをインポートしてしまうと、後から読み込んだ方に上書きされてバグの原因になります。# 【危険な例】自分で作った関数がインポートで上書きされる def greet(): print("こんにちは!") # 別のモジュールに greet という同名の機能があった場合、自作のgreetが消滅します from my_module import greet greet() # 自分の意図した「こんにちは!」ではなく、my_module のgreetが動いてしまう - ワイルドカード(*)が引き起こす罠:
from モジュール名 import *を多用すると、背景で一体どんな名前の関数がインポートされたのかが持ち主(開発者)にも見えなくなります。コードが読みづらくなるだけでなく、予期せぬ名前の衝突を誘発するため、必要なものだけを明示的に書くようにしましょう。# 【危険な例】何がインポートされたか見えない from module_a import * from module_b import * # この func() は a と b のどちらのモジュールのものか、コードを見ただけでは判断できなくなります func() - 循環インポート(エラー)の発生:2つのファイル(ファイルAとファイルB)が、お互いに
from B import ...、from A import ...とfromを使って読み込み合うと、読み込みの無限ループが発生し、ImportErrorでプログラムが強制終了してしまいます。
fromのよくある質問
- Q: `import math` と `from math import sqrt` は、どちらが処理速度やメモリの面で有利ですか?
- A: 実は、どちらの書き方をしてもPythonは内部的に
mathモジュール全体を一度ロード(メモリに展開)するため、メモリの消費量や処理速度にほとんど違いはありません。最大の違いは「コードの書きやすさ・読みやすさ」にあります。特定の関数を何回も使うならfromを使った方がコードが綺麗になります。# 内部的な読み込み範囲は同じ。記述が短くなるかどうかの違い import math print(math.sin(1) + math.cos(1) + math.tan(1)) # from を使えばスッキリ記述できる from math import sin, cos, tan print(sin(1) + cos(1) + tan(1)) - Q: 自分が作った別のPythonファイル(自作スクリプト)から関数を引っ張ってくる場合も `from` は使えますか?
- A: はい、全く同じように使えます。同じフォルダ内に
tools.pyというファイルがあり、その中にmy_funcという関数を作ってあれば、別ファイルから以下のように呼び出せます。# tools.py という自作ファイルから my_func 関数をインポートする from tools import my_func my_func() # 自分の作った関数を別ファイルで使い回せる
まとめ
from は、プログラムに必要な部品だけをスマートに指名手配して、コードの記述量を減らすための便利なキーワードです。
- 特定のモジュールから、必要な関数やクラスだけを指定してインポートできる。
- インポートされた機能は「モジュール名.」を省略して、直接その名前だけで実行可能になる。
*を使った全インポートは名前の衝突バグを引き起こしやすいため、極力避けて必要な要素を明示する。
プログラムの規模が大きくなるにつれて、外部モジュールや自作ファイルのインポート作業は必ず増えていきます。from を適切に使って、誰が見ても読みやすい綺麗なコードを維持しましょう。