0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】初学者の私が躓いたこと⑥

0
Last updated at Posted at 2026-05-14

こんにちは!
今回はimportについてです。
これまでの記事でも、度々import という言葉を出しました。

import calendar
import json

なんとなく「使いたいお道具箱を持ってくるために使うやつ」という認識でいたんですが、from を使う書き方が出てきたときに、「あれ、これって何が違うの?」となりました。
他にも「あれ?」と思った方、絶対にいると思ってます。
今回はその import の使い方を整理します。


import calendar → 箱ごと持ってくる

import calendar

calendar.prmonth(2026, 5)

これは「calendar という道具箱を丸ごと持ってくる」という意味です。
道具箱ごと持ってきているので、使うときは必ず 「道具箱の名前.道具の名前」 という形になります。

calendar.prmonth(2026, 5)   # calendar(箱)の中の prmonth(道具)を使う
calendar.calendar(2026)     # calendar(箱)の中の calendar(道具)を使う

from calendar import prmonth → 中身だけ取り出す

from calendar import prmonth

prmonth(2026, 5)   # calendar. が不要!

こちらfromがつくバージョンです。
これは「calendar という道具箱から、prmonth という道具だけを取り出す」という意味です。
道具そのものを手元に持ってきているので、使うときに「どの箱から?」を書く必要がありません。

# import calendar の場合
calendar.prmonth(2026, 5)   # 箱の名前が必要

# from calendar import prmonth の場合
prmonth(2026, 5)            # 道具だけ取り出したので不要

どっちの書き方が良いんだろう、と思ったとき、普通はimport calendarの方が楽に見えませんか。
小出しに道具を持ってくるよりも、まとめて道具箱を持ってきて、必要に応じて好きな道具を取り出した方が、
はるかに楽じゃないですか……?
必要なものは最初にばっと持ってきた方がいい。
面倒くさがりなので、私はそう思います。

でも、世の中そう甘くない。

道具箱を丸ごと持ってくるということは、箱の中の道具が全部、自分の手元に並ぶということです。

道具箱と称しているからには、たくさんの道具が入っている。
つまりcalendar モジュール(道具箱)には prmonth 以外にもたくさんの関数(道具)が入っています。
それが全部、自分の作業スペースに展開される状態になるということです。

ここで、問題が起きます。

別の道具箱も持ってきたとき、同じ名前の道具がかぶってしまうことがあるんです。

え……?同じ名前……?(蘇る過去記事の難解たち)
大丈夫、落ち着こう、自分。
確かに、慣習通りに名前をつけることをしていたら、そりゃあ同じ名前のものが別のモジュール内に存在しても不思議ではないですよね。

import moduleA   # この中に calc という関数がある
import moduleB   # この中にも calc という関数がある

calc()   # どっちの calc??

上記を「どっちのcalc問題」と呼ぶことにします。そのままですが。
これ、エラーにならないんですよね。
気付かないまま、意図しない方の関数を使い続けてしまうことがあります。
危険ですね。

よってfrom import で必要なものだけ取り出していれば、何を持ってきているかが明確なので、この問題が起きにくくなります。
これがただ闇雲にimportで道具箱を持ってこない理由になるわけです。

とはいえ、import calendar の形が向いている場面もあります。
例えば同じモジュールからたくさんの道具を使うときです。

import calendar

calendar.prmonth(2026, 5)
calendar.isleap(2026)
calendar.monthrange(2026, 5)

from で書くと、使う道具の数だけ import 行が長くなってしまいます。
こういうときは箱ごと持ってきた方がすっきりします。

また calendar.prmonth のように書くことで、「これは calendar の機能だ」とひと目でわかる読みやすさもあります。
適材適所ってやつですね。


from calendar import * → 箱をひっくり返す

from calendar import *

こういう使い方もあるのだそうで。
calendarモジュールの中身の*をインポートする……?*って?」と思いますよね。
*(アスタリスク)」は「全部」という意味です。
つまり**「道具箱をひっくり返して、中身を全部取り出す」**ようなイメージです。

import calendarと何が違うんだ??と思いますが、まず2つの違いについて記載します。

import calendar の場合

箱ごと持ってくるけど、使うときは必ず calendar. をつける必要がある。

import calendar
prmonth(2026, 5)           # エラー!calendar. が必要
calendar.prmonth(2026, 5)  # OK

from calendar import * の場合

中身を全部バラして手元に並べる。calendar. なしで使える。

from calendar import *
prmonth(2026, 5)   # OK!箱の名前が不要

つまり違いは**「箱ごと持ってくるか、バラして並べるか」**です。

import は箱のまま持ってくるので、calendar.prmonth のように「どの箱か」が常に明確。
* は全部バラして並べるので、名前がかぶったときに「どっちの関数か」がわからなくなる、というわけです。
以下に例を示します。

from calendar import *
from json import *   # json の中に calendar と同じ名前の関数があったら?

「どっちの関数を使っているのかわからない」という状態になります。テーブルの上がぐちゃぐちゃになるイメージです。

……え??いいとこなくない?
そもそも*を使う機会なんてあるの?って話なんですけど……ないんだよな、これ。
「動作確認したいだけ」「使い捨てのコード」のときは楽なんですが、ちゃんとしたコードに書くのは基本NGとされています。
なので「* を使う場面はある」というより「* を許容できる場面がたまにある」くらいのイメージです。
* を使うのは基本的に避けた方がいい、というのが一般的な考え方ってことですね。
ちなみに * で全部取り出すとき、_(アンダースコア)で始まる名前は取り出されません。これは「内部用だから外に出さないでね」という意味合いがあります。


3つの import をまとめると

書き方 イメージ 使うとき
import calendar 箱ごと持ってくる 複数の道具を使うとき
from calendar import prmonth 中身だけ取り出す 特定の道具だけ使うとき
from calendar import * 箱をひっくり返す 基本的に避ける

今回は以上です!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?