Перейти до змісту

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")

Результат виконання скрипту:

$ python examples_01_sum_numbers.py
Start
res1=300
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 виглядає так:

$ python examples_02_import_sum_numbers.py
101
102
103

Тепер виводиться лише інформація зі скрипту examples_02_import_sum_numbers.py.

Загалом краще звикнути писати весь код, який викликає функції і виводить щось на стандартний потік виведення, всередині блоку if __name__ == "__main__".

Warning

Для коректної роботи з тестами завдань, починаючи з 11 розділу, краще завжди писати виклик функції всередині блоку if __name__ == "__main__". Відсутність цього блоку викликатиме помилки в деяких завданнях.