基礎・中級問題チェック

問題 26 /40

コマンドラインで「python start.py」を実行した結果として、正しいものはどれか。

greet.py
-------------------------------
def say_hello():
    print('hello')

say_hello()
-------------------------------

start.py
-------------------------------
import greet

print('start')
-------------------------------

選択 1

hello
start

選択 2

start
hello

選択 3

start

選択 4

hello

解説

選択肢1が正解です。

greet.py
-------------------------------
def say_hello():
    print('hello')

say_hello()
-------------------------------

start.py
-------------------------------
import greet

print('start')
-------------------------------

python start.py(コマンドラインで実行)
▶︎
hello
start

start.pyを実行すると、最初に「import greet」が実行されます。

モジュールをimportすると、そのファイルのコードが上から順に実行されるため、greet.pyのsay_hello()が実行され、「hello」が表示されます。

その後にstart.pyのprint('start')が実行され、「start」が表示されます。

本来、importは関数やクラスなどの定義を読み込むためのものであり、処理を実行することは想定されていません。

ただし、問題文のコードはgreet.pyにsay_hello()が直接書かれているため、importしただけで関数が実行され、意図しない処理が発生します。

この問題を防ぐために、次のように「if __name__ == '__main__'」を記述します。

greet.py
-------------------------------
def say_hello():
    print('hello')

if __name__ == '__main__':
    say_hello()
-------------------------------

Pythonには特別な変数「__name__」があり、実行方法によって入る値が変わります。

◾️「python greet.py」で直接実行
__name__に「__main__」が入る。

◾️「import greet」でインポート
__name__に「greet(ファイル名)」が入る。

つまり、「import greet」でインポートした場合は、「if 'greet' == '__main__'」がFalseとなり、say_hello()は実行されません。

start.pyでsay_hello()を実行する場合は、次のように明示的に呼び出します。

start.py
-------------------------------
import greet

greet.say_hello()

print('start')
-------------------------------

このように「if __name__ == '__main__'」を記述すると、importしただけでは実行されず、必要なときだけ関数を呼び出すことができます。


(公式書籍 p.62)