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