基礎・中級問題チェック
問題 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)