パッケージ
└ モジュール
PythonやDelphiなどは、ファイルごとに名前空間が独立しています。 したがって、インポートするモジュールの内部でいくらいろんなモジュールをインポートしていても インポートする側の名前空間からそれらのモジュールを直接アクセスする事は出来ません。 また、インポートする側の 名前空間を暗黙のうちに上書きされる こともありません。
アスタリスクを用いるリスクとは、暗黙のうちに名前空間が汚されるということです。 つまり「明示されている」という事は非常に重要なことなのです。
# NG
from a import *
# OK
from a import bfrom a import *でインポートしたときのdir()を見てみるとわかるけど、使わないものまでインポートされてしまう。
ただし、ファイルをインポートした時に同じ名前のメソッドがあった場合は危険であるから、必要なメソッドや変数のみに絞ってインポートしたい時がある。
なるほど、複数ファイルで同じ名前のメソッドがあった場合、暗黙的に上書きされちゃうかもしれないから、明示的に記述するのか
/foo
- __init__.py #from bar import PIYO
- bar.py #PIYO=100__init__.pyであらかじめインポートしておくことでimport fooでfoo.PIYOとすることができる
何かしらいろいろと作ってくるとコード数が増えて、「昨日書いたコードは今日の敵」のようなことになってしまうので、なるべく機能ごとにまとめて管理していきたい。
.
`-- subdir
`-- greeting.pygreeting.pyの中にdaytime関数がある場合
>>> from subdir.greeting import daytime # from部分にmoduleを連結して書く
>>> daytime() # こう呼べる
hey>>> import subdir.greeting # OK
>>> import subdir.greeting.daytime # NG -> daytimeはfunctionのため
>>> import subdir.greeting.SampleClass # NG -> SampleClassはクラスのため>>> from subdir import greeting # OK
>>> from subdir.greeting import daytime # OK
>>> from subdir.greeting import SampleClass # OK>>> import subdir.greeting # OK
>>> from subdir import greeting.daytime # NG -> importの部分で.を使っているため
>>> from