やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Pythonのモジュールとパッケージを作ってみた

Pythonのモジュールとパッケージを作ってみた。

前回まで

ラズパイのCPU温度を計測したい→Fusion Tables APIを使いたい→OAuth2.0→google-api-python-client→OAuthの手入力を省きたい→RefleshToken取得コード書きたい→Python書けん

Pythonには少し触れたことがあったが、勉強していないから思うように書けない。ということで、しばらくはPythonを勉強することに。

前回はPythonインタプリタの対話モードを実行してみた

開発環境

成果物

GitHubHelloWorld
GitHubHelloPackage

参考

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.pyhello_world.pyをimportして実行すると生成された。hello_world.py単独で実行しても生成されなかった。

pycファイルをテキストエディタで開くとバイナリっぽい。C言語でいうオブジェクトファイル的なものだろうか。Pythonインタプリタとして実行するだけでなく、コンパイラとして機械語翻訳したオブジェクトファイルも作成できるらしい。実行速度UPが期待できそうか。

中身についてはこちらを参照。感謝。

パッケージ

ファイル&ディレクトリ作成

__init__.pyという空のファイルがあれば、そのディレクトリがパッケージになる。

実験する。以下のようなディレクトリとファイルを作成する。

  • test/
    • main.py
    • hello/
      • init.py
      • standard_output.py

シンタックスエラー

最初はstandard_output.pyprint.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}のようにもできるらしい。

実行

  1. カレントディレクトリをtestディレクトリに移動する。
  2. 実行する(以下のコマンドを叩く)
python main.py

以下のように表示される。

Hello World !!

所感

PythonのパッケージはC++,C#でいう名前空間のことだろうか?C++,C#ディレクトリ構造と直接結びついているわけではなかったと思う。Pythonディレクトリ構造と結びつけることで、ソースコードのimport文からその実装ファイルパスが判明するので探しやすそう。コードを追いやすいというのは、コードの見易さに繋がる。書きやすさより読みやすさを優先するというPythonらしい仕組みなのかもしれない。

しかし一見すると__init__.pyって何だよ!と思う。特殊なルールは慣れるしかない。でも、パッケージごとにこのファイルを作るのは無駄にも思える。編集するときも面倒くさそう。OSのファイルシステムにおける文字コードは問題にならないのだろうか。ASCII文字だけ使えということか。

print.pyモジュールが作成できなかったのも気になる。好きな名前で作らせてくれよと思った。原因も調べていない。

次回以降はもうすこし細かい構造、メソッド、クラスをやる。