前回は、「5.会員・予約情報の管理」について発信しました。
今回からいよいよプログラミングに突入します。以降を読み進めると、「えっ、こいつこんな初歩の初歩から理解してないの?」と思われるかもしれませんが、はい、そのとおりなんです。初心者がググりまくって「強要」に立ち向かっていく様を、温かい目で閲覧いただければ幸いです。
何をどう書いていけば良い?
今回の予約プログラムは、極々小規模なので、上から下に向かってダラダラと記述しても問題ないと思います。でも一応一般的な書き方ってあるのかなと思いググってみました。すると 「これは何をしているのであるか???」 というような、Python特有の書き方にぶち当たりました。それが下のようなものです。
# main関数です。
def main:
print("main proc")
# 意味不明な部分です。
if __name__ == '__main__':
main()
"def main:" は、main関数を定義している部分で、Cや Javaなども main関数(メソッド)をエントリポイントとしているのでわかりやすいのですが、その下の if文が???でした。
- 半角アンダーライン2本で囲んだ「__name__」って何なんでしょうか?
- それが 「__main__」だったら、main関数を実行する。というのもわかりません。
でも、すこしググってわかりました。
結論としては、この if文は、
importされることを想定してないのに、importされてしまった場合の防止策。
スクリプトとして実行されたときだけ処理するから。
という意味だと理解しました。
まず、__name__ですが、以下のような感じです。
- __name__は、Python実行時に自動的に作成されるグローバル変数です。
- __name__には、実行しているモジュール名が格納されます。
- 「python test.py」で実行された場合は、"__name__"には "__main__"が格納されてる。
- 別プログラムから importされたときは、"__name__"には自身のモジュール名が格納されてる。
具体的に見ていきます。
__name__ の値を表示するだけのプログラム test.py を作成しました。
# __name__の値を表示します。
print(__name__)
作成した test.pyをパワーシェルで スクリプトとして実行 してみます。
PS C:\> Python test.py
__main__
"__main__"と表示されました。
スクリプトとして実行された場合、__name__ には "__main__"が格納されていることがわかります。
次に test.pyを importする proc.py を作成します。
# testをインポートします。
import test
作成した proc.pyをパワーシェルで実行してみます。
PS C:\> Python proc.py
test1
"test1"と表示されました。 import(モジュールとして実行)された 場合は、自身のモジュール名が格納されていることがわかります。
そして驚くべきは、 「importした時点でそのモジュールは実行される。」
という事実です。test.pyを importしたときに test.pyの処理が実行されています。importされるべくして作成されたモジュールであれば問題ありませんが、スクリプトとして実行されることを想定してつくられたpyファイルを importしてしまったら、なんだか怖いことが起こりそうです。
なので意味不明な if文は、
スクリプトとして実行された場合だけプログラムを実行し、それ以外は実行できない ようにしているのです。
test.pyを書き直します。(proc.pyは変更なし)
# スクリプトとして実行された場合だけ__name__の値を表示して
# 他プログラムに importされたときは実行しないでね。 (* ˊᵕˋㅅ)
if __name__ == '__main__':
print(__name__)
双方パワーシェルで実行してみます。
PS C:\> Python test.py
__main__
PS C:\> Python proc.py
PS C:\>
なるほどーーーーーーー
なぞが解けて心晴れ晴れなのですが、進み具合を考えると、何も考えずに ググってコピペ 誘惑に抱きしめられそうになります。ですが、 急がば回れ! を信じて頑張ります。クルクルクルクルっ
今回は、どうやってプログラムを書き始めるのかがわかりました。
次回は、いよいよ main関数の中身を書いていきたいと思います。