Pythonのモジュールとパッケージを作ってみた
Pythonのモジュールとパッケージを作ってみた。
前回まで
ラズパイのCPU温度を計測したい→Fusion Tables APIを使いたい→OAuth2.0→google-api-python-client
→OAuthの手入力を省きたい→RefleshToken取得コード書きたい→Python書けん
Pythonには少し触れたことがあったが、勉強していないから思うように書けない。ということで、しばらくはPythonを勉強することに。
開発環境
- Windows XP Pro SP3 32bit
- cmd.exe(ConEmu/Nyagos)
- Python 2.7.10
- Python 3.4.4
成果物
参考
Python基礎講座が勉強になった。感謝。
構造
Pythonは以下のような構造らしい。構造を把握できれば、コードの大枠だけは書けるようになるだろう。
和名 | 英名 | コード例 | 構造 |
---|---|---|---|
パッケージ | Package | __init__.py |
1ディレクトリ1パッケージ |
モジュール | Module | module_name.py |
1ファイル1モジュール |
クラス | Class | class {ClassName}: |
1モジュールnクラス |
メソッド | Method | def {method_name}({param1},{param2},...): |
1クラスnメソッド |
構造の大きい順。他は、if-else文、for文、while文、with文、try-catchのような構文くらいか?
モジュール
こちらがとてもわかりやすい。感謝。
test.py
というファイルを新規作成すると、test
というモジュールになる。ファイルを作成しないとはじまらないから、モジュールは必ずつくることになる。と思う。
Hello World !!
hello_world.py
print('Hello Python !!')
コンソールを起動し、以下のようにして実行する。
python hello_world.py
Hello Python !!
が表示される。
- クラスもメイン関数も書かずに実行コードを書ける!
- print文などメソッドの
()
は省略せず書く(Python2→3へ移植しやすくするため)
モジュールのimport
hello_world.py
とおなじディレクトリに以下のファイルを作成する。
main.py
import hello_world
コンソールにて実行する。
python main.py
Hello Python !!
が表示される。
import {name}
の{name}の部分には、モジュール名が入る。
.pyc
実行後、hello_world.pyc
というファイルが生成された。
main.py
でhello_world.py
をimportして実行すると生成された。hello_world.py
単独で実行しても生成されなかった。
pycファイルをテキストエディタで開くとバイナリっぽい。C言語でいうオブジェクトファイル的なものだろうか。Pythonはインタプリタとして実行するだけでなく、コンパイラとして機械語翻訳したオブジェクトファイルも作成できるらしい。実行速度UPが期待できそうか。
中身についてはこちらを参照。感謝。
パッケージ
ファイル&ディレクトリ作成
__init__.py
という空のファイルがあれば、そのディレクトリがパッケージになる。
実験する。以下のようなディレクトリとファイルを作成する。
- test/
- main.py
- hello/
- init.py
- standard_output.py
シンタックスエラー
最初はstandard_output.py
をprint.py
にしていたが、import文でシンタックスエラーになった。標準関数名は予約語として使えないのか?
コーディング
main.py
import hello.standard_output
standard_output.py
print("Hello World !!")
import {name}
の{name}の部分にはモジュール名が入る。モジュールがパッケージ配下なら、pakage_name.module_name
のように.
で区切る。パッケージの階層がもっと深いときも同じ。
from {pakage_name} import {module_name}
のようにもできるらしい。
実行
python main.py
以下のように表示される。
Hello World !!
所感
PythonのパッケージはC++,C#でいう名前空間のことだろうか?C++,C#はディレクトリ構造と直接結びついているわけではなかったと思う。Pythonはディレクトリ構造と結びつけることで、ソースコードのimport文からその実装ファイルパスが判明するので探しやすそう。コードを追いやすいというのは、コードの見易さに繋がる。書きやすさより読みやすさを優先するというPythonらしい仕組みなのかもしれない。
しかし一見すると__init__.py
って何だよ!と思う。特殊なルールは慣れるしかない。でも、パッケージごとにこのファイルを作るのは無駄にも思える。編集するときも面倒くさそう。OSのファイルシステムにおける文字コードは問題にならないのだろうか。ASCII文字だけ使えということか。
print.py
モジュールが作成できなかったのも気になる。好きな名前で作らせてくれよと思った。原因も調べていない。
次回以降はもうすこし細かい構造、メソッド、クラスをやる。