概要
Pythonのパッケージとモジュールのimportの方法に関してようやく腑に落ちたのでメモ。
例:scikit-learnの graph_lasso_モジュールのGraphicalLassoクラスをimportする
sklearn/covariance/graph_lasso_.py 内にGraphicalLassoクラスが定義されています。
今回の例において、各オブジェクトの名称は以下のように解釈できます。
sklearn: パッケージ <- ディレクトリであり、__init__.pyが存在するため
covariance: パッケージ <- ディレクトリであり、__init__.pyが存在するため
graph_lasso_: モジュール <- graph_lasso_.py という名のファイルが存在する
GraphicalLasso: クラス <- graph_lasso_.py 内で定義されている。
- (モジュールとパッケージの定義に関してはこちらの記事を参照してください。)
- あまり基礎から教えてもらうことがないpythonのimportについて。モジュール?パッケージ?クラス?
試したこと
下記の①と②を比較してみましょう。
パッケージからモジュールをインポートせず、直接クラスなどのオブジェクトをimportすることが可能であることがわかります。
具体的には下記の②が該当します。②においてはgraph_lasso_(.py)を呼び出さずに直接GraphicalLassoクラスのオブジェクトをimportしています。
# $ python3
Python 3.6.1 (default, Jul 13 2017, 17:01:43)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
# ①パッケージからモジュール(.py)をインポートし、その後クラスをインポートする。
>>> from sklearn.covariance import graph_lasso_
>>> graph_lasso_.GraphicalLasso()
GraphicalLasso(alpha=0.01, assume_centered=False, enet_tol=0.0001,
max_iter=100, mode='cd', tol=0.0001, verbose=False)
# ②パッケージから直接クラスをインポートする。
# (モジュールのインポートを明示的に行わなくても良い。)
>>> from sklearn.covariance import GraphicalLasso
>>> GraphicalLasso()
GraphicalLasso(alpha=0.01, assume_centered=False, enet_tol=0.0001,
max_iter=100, mode='cd', tol=0.0001, verbose=False)
>>>
もちろん①のようにモジュール名を指定してimportすることも可能です。しかし、②のように予め使用するメソッドをソースの上部付近でimportするほうが、記述するコードが少なくスコープを狭めてインポートすることができるメリットがあります。その結果、ソースコードの可読性が高くなると思われます。(個人の意見です)
最後に
実際のコードでは①と②が入り交じって書かれることが多く正しく理解しないままであったのでまとめてみました。
以上です。