Skip to content

Instantly share code, notes, and snippets.

@tamago324
Created June 15, 2018 04:00
Show Gist options
  • Save tamago324/be61f55e07c8be39acb41f55fca93bcf to your computer and use it in GitHub Desktop.
Save tamago324/be61f55e07c8be39acb41f55fca93bcf to your computer and use it in GitHub Desktop.
Pythonのインポートについてのメモ

パッケージとモジュール

パッケージ
└ モジュール

モジュールはシングルトン

ファイルごとに名前空間が独立している

PythonやDelphiなどは、ファイルごとに名前空間が独立しています。 したがって、インポートするモジュールの内部でいくらいろんなモジュールをインポートしていても インポートする側の名前空間からそれらのモジュールを直接アクセスする事は出来ません。 また、インポートする側の 名前空間を暗黙のうちに上書きされる こともありません。

importは明示的にする

アスタリスクを用いるリスクとは、暗黙のうちに名前空間が汚されるということです。 つまり「明示されている」という事は非常に重要なことなのです。

# 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 foofoo.PIYOとすることができる

昨日書いたコードは今日の敵

何かしらいろいろと作ってくるとコード数が増えて、「昨日書いたコードは今日の敵」のようなことになってしまうので、なるべく機能ごとにまとめて管理していきたい。

ファイル分割 = 名前空間の作成

パッケージ内のモジュール内の関数をインポート

.
`-- subdir
    `-- greeting.py

greeting.pyの中にdaytime関数がある場合

>>> from subdir.greeting import daytime  # from部分にmoduleを連結して書く

>>> daytime()                            # こう呼べる
hey

fromを使わない場合はimportに書けるのはmoduleのみ

>>> import subdir.greeting              # OK
>>> import subdir.greeting.daytime      # NG -> daytimeはfunctionのため
>>> import subdir.greeting.SampleClass  # NG -> SampleClassはクラスのため

fromはどのインポートにも使える

>>> from subdir import greeting             # OK
>>> from subdir.greeting import daytime     # OK
>>> from subdir.greeting import SampleClass # OK

fromを使ったときのimportに.は使えない

>>> import subdir.greeting                # OK
>>> from subdir import greeting.daytime   # NG -> importの部分で.を使っているため
>>> from

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment