【なまえくうかん】

名前空間 とは?

最終更新:
💡 名前の「住所」をつけて衝突を防ぐ仕組み

変数・関数・型などの名前を、どのまとまりに属するかと合わせて区別する仕組み。同じ短い名前を別の名前空間で使えるようにし、ライブラリなどとの名前の衝突を避ける。参照の書き方やルールは言語ごとに異なる。

📌 このページのポイント
所属を添えて、同じ名前を区別する app.py class User app.User api.py class User api.User 短い名前は同じでも、所属が違う Userだけを同じ場所に持ち込むと 衝突・上書きの原因になり得る
Pythonの二つのモジュールにあるUserを、所属も付けて参照する例。
ひよこ ひよこ
名前空間ってなぜ必要なの?
ペンギン先生 ペンギン先生
二つのライブラリがどちらもUserという型を定義したとしよう。所属も付けてapp.Userとapi.Userのように参照すれば、どちらかを区別できる。同じ田中さんでも部署を添えて呼ぶのに似ているね。名前だけを同じ場所へ持ち込むと、衝突や上書きの原因になり得るよ。
ひよこ ひよこ
プログラミング言語ではどう書くの?
ペンギン先生 ペンギン先生
C++ならnamespace Appの中に置いたUserをApp::Userと書く。Pythonならapp.pyで定義したUserを、import appの後にapp.Userで参照できる。Pythonの名前空間は名前とオブジェクトの対応関係で、スコープは名前を直接参照できるプログラム上の範囲なんだ。
ひよこ ひよこ
名前空間で気をつけることってある?
ペンギン先生 ペンギン先生
Pythonのfrom app import Userは、Userという名前を読み込み先の名前空間へ追加するよ。from app import *では公開対象の名前をまとめて追加するので、既存の名前を隠すことがある。名前空間を無視するのではなく、名前の持ち込み方が違うんだ。必要な名前や別名を明示すると分かりやすいね。
ひよこ ひよこ
Kubernetesでも名前空間って使うの?
ペンギン先生 ペンギン先生
同じクラスタ内でPodやServiceなどをまとめるよ。たとえばdevelopmentとproductionに同じ名前のServiceを置ける。ただし名前空間を持つ種類のリソースが対象で、NodeやPersistentVolumeなどクラスタ全体のリソースには当てはまらない。名前空間を分けるだけで通信まで禁止されるとは考えないでね。
ひよこ ひよこ
LinuxやDockerの名前空間も同じものなの?
ペンギン先生 ペンギン先生
名前や資源が見える範囲を分けるという考えは共通だけど、同じ機能ではないよ。LinuxではプロセスIDやネットワークなどの見える範囲を分け、Dockerもその仕組みを使う。資源の上限を扱うcgroupsや権限設定なども組み合わせるので、名前空間だけでコンテナの隔離すべてを実現するわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「名前空間」って出てきたら「名前の衝突を防ぐためにグループ分けする仕組みだな」と思えればだいたいOK!
📖 おまけ:英語の意味
「namespace」 = 名前の空間
💬 同じ「田中さん」でも「営業部の田中さん」と「開発部の田中さん」を区別するのと同じ発想だよ

参考資料

← 用語集にもどる