if __name__ == "__main__"
¶
Досить часто скрипт може виконуватися самостійно, і може бути імпортований як модуль іншим скриптом. Оскільки імпорт скрипту виконує код цього скрипту, часто треба зазначити, що якісь рядки не повинні виконуватися під час імпорту.
У попередньому прикладі було два скрипти: examples_01_sum_numbers.py та examples_02_import_sum_numbers.py. І при запуску examples_02 відображалися print з examples_01.
У Python є спеціальний прийом, який дозволяє вказати, що код не повинен
виконуватися при імпорті: всі рядки, які знаходяться в блоці if __name__ == "__main__"
не виконуються під час імпорту.
Змінна __name__
- це спеціальна змінна, яка дорівнює "__main__"
, тільки якщо
файл запускається як основна програма, і дорівнює імені модуля під час
імпорту модуля. Тобто, умова if __name__ == "__main__"
перевіряє, чи файл був
запущений як основна програма.
Як правило, в блок if __name__ == "__main__"
заносять усі виклики функцій та
виведення інформації на стандартний потік виведення. Тобто в скрипті
examples_01_sum_numbers.py в цьому блоці буде все, крім функції sum_numbers:
def sum_numbers(num1, num2):
return num1 + num2
if __name__ == "__main__":
print("Start")
res1 = sum_numbers(100, 200)
print(f"{res1=}")
print("Stop")
Результат виконання скрипту:
Під час виконання скрипту examples_01_sum_numbers.py виконуються всі рядки,
оскільки змінна __name__
у цьому випадку дорівнює "__main__"
.
Скрипт examples_02_import_sum_numbers.py залишається без змін
from examples_01_sum_numbers import sum_numbers
numbers = [1, 2, 3]
for num in numbers:
print(sum_numbers(100, num))
Виконання examples_02_import_sum_numbers.py виглядає так:
Тепер виводиться лише інформація зі скрипту examples_02_import_sum_numbers.py.
Загалом краще звикнути писати весь код, який викликає функції і виводить щось
на стандартний потік виведення, всередині блоку if __name__ == "__main__"
.
Warning
Для коректної роботи з тестами завдань, починаючи з 11 розділу, краще
завжди писати виклик функції всередині блоку if __name__ == "__main__"
.
Відсутність цього блоку викликатиме помилки в деяких завданнях.