Python __init__.py
の書き方
Pythonのパッケージを作るのに欠かせない__init__.py
。
正直自分にとって面倒でイライラする存在でした。
もしかしたらみんな知っているかもしれないけど、
__init__.py
作り方についてご紹介します。
初心者にとって面倒な__init__.py
まず、__init__.py
って何?という話ですよね。
__init__.py
とは
__init__.py
は2つの意味がある
1つはPythonディレクトリを表す役割を担う
1つはモジュールをimportするときの初期化処理を行う
...僕は最初のうち、この説明ではよくわかりませんでした。
やっていけば分かるはずなのでここではこれ以上この説明に突っ込みません。
import ~ と from ~ import ~ の違い
__init__.py
の説明の前にまず、importとfromについての説明を少々。
import
import モジュール名 [as 別名]
あるモジュールの機能を追加する
機能を利用するときは
(モジュール名 もしくは 別名).(機能名)と入力します。
#randomというパッケージをimport
import random
#random内のrandintという関数を使う
A=random.randint(0,100)
print(A)
A=[1,2,3,4,5]
#matplotlib内にあるpyplot.pyをimport
import matplotlib.pyplot as plt
#pyplot.pyのplotという関数を使う
plt.plot(A)
plt.show()
from import
from モジュール名 import 機能名
あるモジュールのある機能を追加する
ある機能のみを追加したいとき、モジュール名を書かずに使うことができます。
A=[1,2,3,4,5]
#matplotlibパッケージ内のpyplot.py内にあるplot関数とshow関数の2つのみをimport
from matplotlib.pyplot import plot,show
plot(A)
show()
この2つはあまり大きな違いはありませんが__init__.py
では意味が変わります。
__init__.py
の書き方
では、__init__.py
の書き方についてご紹介。
まず、パッケージの例を挙げます。
↓パッケージ“test_imt”の構成
📁test_imt
├──📄__init__.py
├──📄main.py
└──📄sub.py
import test_imt.sub as ts
def chkprint2():
ts.chkprint()
print("You use main.py!")
def chkprint():
print("You use sub.py!")
注意ですが、パッケージにするときの同じディレクトリ内のモジュールのimportはパッケージ名から書いた方がいいです。
import (パッケージ名).(モジュール名)
__init__.py
の中身がからのとき
__init__.py
は実は何も書かなくてもいいのです。
ただし、importして関数を使いたい時、多少面倒です。
例えばmain.py
のchkprint2
関数を使いたいときに次のように入力します。
import test_imt as ti
ti.main.chkprint2()
#結果
#You use sub.py!
#You use main.py!
“main”とモジュール名を間に入れることになります。
それでもいいと言うならいいですが、公開するとき、使う相手はモジュール名を確認しなければならないかもしれません。
ちなみにモジュール名を書かないと次のようになります。
import test_imt as ti
ti.chkprint2()
#結果
#test.py, line 2, in <module>
# ti.chkprint2()
#AttributeError: module 'test_imt' has no attribute 'chkprint2'
意味:
test_imt
にはchkprint2
なんて関数は無いよ!
__init__.py
でモジュール名をカット
では、モジュール名をカットする方法は...?
例えばmain.py
のchkprint2
関数をモジュール名をカットして使いたいときには次のようにします。
__init__.py
の中身
from test_imt.main import *
import時
import test_imt as ti
ti.chkprint2()
#結果
#You use sub.py!
#You use main.py!
ここではfrom ~ import *
を利用します。
import ~
を利用するとモジュール名をカットして関数を使うと先程のエラーが発生します。
このような性質があるのなら
• モジュール名をカットして使いたいときはfrom ~ import *
を使って書く
• ただ単に準備の為に作ったモジュールで、公開するとき必要性が無いものはimport ~
を使って書く
と使い分けできます。
例えば、
main.py
の中身を主に使用するならfrom test_imt.main import *
と書く。
sub.py
をプログラム内に取り込むだけで主要な関数が無いならimport test_imt.sub
と書く。
ちなみにiPhone上でPythonができるPythonista3では予測変換があり、さらにsite-package3に自作パッケージを入れて実際にパッケージとしてチェックできます。
あ、あと、__init__.py
内で関数を定義できます。__init__.py
で定義した関数はモジュール名を書く必要がないです。
最後まで見てくれて本当にありがとうございます!
もしかしたら、わかりにくかったかもしれません...もしそうだったら、すみませでした...