0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】妻に真夜中のダンスレッスン予約を強要されたので、Webスクレイピングで回避を試みようとしている話 (6.プログラミングの始まり)

Posted at

前回は、「5.会員・予約情報の管理」について発信しました。
今回からいよいよプログラミングに突入します。以降を読み進めると、「えっ、こいつこんな初歩の初歩から理解してないの?」と思われるかもしれませんが、はい、そのとおりなんです。初心者がググりまくって「強要」に立ち向かっていく様を、温かい目で閲覧いただければ幸いです。:tired_face:

何をどう書いていけば良い?

今回の予約プログラムは、極々小規模なので、上から下に向かってダラダラと記述しても問題ないと思います。でも一応一般的な書き方ってあるのかなと思いググってみました。すると 「これは何をしているのであるか???」 というような、Python特有の書き方にぶち当たりました。それが下のようなものです。

# main関数です。
def main:
    print("main proc")

# 意味不明な部分です。
if __name__ == '__main__':
    main()

"def main:" は、main関数を定義している部分で、Cや Javaなども main関数(メソッド)をエントリポイントとしているのでわかりやすいのですが、その下の if文が???でした。:flushed:

  • 半角アンダーライン2本で囲んだ「__name__」って何なんでしょうか?
  • それが 「__main__」だったら、main関数を実行する。というのもわかりません。

でも、すこしググってわかりました。:blush:

結論としては、この if文は、

importされることを想定してないのに、importされてしまった場合の防止策。
スクリプトとして実行されたときだけ処理するから。

という意味だと理解しました。

まず、__name__ですが、以下のような感じです。

  • __name__は、Python実行時に自動的に作成されるグローバル変数です。
  • __name__には、実行しているモジュール名が格納されます。
  • 「python test.py」で実行された場合は、"__name__"には "__main__"が格納されてる。
  • 別プログラムから importされたときは、"__name__"には自身のモジュール名が格納されてる。

具体的に見ていきます。

__name__ の値を表示するだけのプログラム test.py を作成しました。

test.py
# __name__の値を表示します。
print(__name__)

作成した test.pyをパワーシェルで スクリプトとして実行 してみます。

PS C:\> Python test.py
__main__

"__main__"と表示されました。
スクリプトとして実行された場合、__name__ には "__main__"が格納されていることがわかります。

次に test.pyを importする proc.py を作成します。

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は変更なし)

test1.py
# スクリプトとして実行された場合だけ__name__の値を表示して
# 他プログラムに importされたときは実行しないでね。 (* ˊᵕˋㅅ)
if __name__ == '__main__':
    print(__name__)

双方パワーシェルで実行してみます。

PS C:\> Python test.py
__main__
PS C:\> Python proc.py
PS C:\>

なるほどーーーーーーー:heart_eyes:

なぞが解けて心晴れ晴れなのですが、進み具合を考えると、何も考えずに ググってコピペ 誘惑に抱きしめられそうになります。ですが、 急がば回れ! を信じて頑張ります。:dancer_tone1:クルクルクルクルっ

今回は、どうやってプログラムを書き始めるのかがわかりました。
次回は、いよいよ main関数の中身を書いていきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?