Edited at

Python __init__.pyの書き方


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 別名]


あるモジュールの機能を追加する

機能を利用するときは


(モジュール名 もしくは 別名).(機能名)と入力します。


例1

#randomというパッケージをimport

import random

#random内のrandintという関数を使う
A=random.randint(0,100)
print(A)



例2

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


main.pyの中身

import test_imt.sub as ts

def chkprint2():
ts.chkprint()
print("You use main.py!")


sub.pyの中身

def chkprint():

print("You use sub.py!")

注意ですが、パッケージにするときの同じディレクトリ内のモジュールのimportはパッケージ名から書いた方がいいです。

import (パッケージ名).(モジュール名)



__init__.pyの中身がからのとき

__init__.pyは実は何も書かなくてもいいのです。

ただし、importして関数を使いたい時、多少面倒です。

例えばmain.pychkprint2関数を使いたいときに次のように入力します。


test.py

import test_imt as ti

ti.main.chkprint2()

#結果
#You use sub.py!
#You use main.py!


“main”とモジュール名を間に入れることになります。

それでもいいと言うならいいですが、公開するとき、使う相手はモジュール名を確認しなければならないかもしれません。


ちなみにモジュール名を書かないと次のようになります。


test.py

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.pychkprint2関数をモジュール名をカットして使いたいときには次のようにします。

__init__.pyの中身


__init__.py

from test_imt.main import *


import時


test.py

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で定義した関数はモジュール名を書く必要がないです。


最後まで見てくれて本当にありがとうございます!

もしかしたら、わかりにくかったかもしれません...もしそうだったら、すみませでした...