Pythonのfromによるモジュールや特定要素のインポート方法をわかりやすく解説

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
~
ad. 価格範囲を指定して商品を探せます

fromの概要

モジュールなどから特定の要素をインポート Python予約語

from

概要 from(フロム)は、特定のモジュールやライブラリ(プログラムの道具箱)の中から、必要な関数やクラスなどの部品だけをピンポイントで取り出すために使用されるキーワードです。基本的には import とセットで使われ、プログラムの記述をスマートにする役割を持ちます。

わかりやすく説明 from は、英語の「〜から(出身)」という意味そのものです。「○○という道具箱『から』、✕✕という道具だけを引っ張ってくる」という指示をPythonに出すときに使います。これを使うと、道具を使うときにいちいち「道具箱の名前」を頭に付けなくてよくなるため、コードがスッキリします。

  • モジュール全体ではなく、特定の関数や変数だけを名指しでインポートできます。
  • インポートした機能は、モジュール名を省略して直接その名前だけで呼び出せるようになります。
  • カンマ区切りで複数の部品を同時に取り出したり、as を使ってオリジナルの別名を付けることも可能です。

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 を適切に使って、誰が見ても読みやすい綺麗なコードを維持しましょう。