Найти в Дзене

Что такое if __name__ == "__main__" и для чего это нужно?

Оглавление

Я решил написать эту статью, потому что в душе не понимал для чего она нужна, когда видел эту конструкцию в чужих программах. Если честно я частенько из интернета брал решения для своего кода и там была эта конструкция. Я просто молча чесал голову и пожимая плечами вставлял это в свой код, мол так и должно быть, а на вопросы коллег "для чего это нужно?", с умным видом отвечал "Так нада! Ты не шаришь". Сейчас же узнав что это, я попытаюсь вам донести свои мысли

Я думаю вы когда-то сталкивались с такой конструкцией как
if __name__ == "__main__".


Я как и вы пытался гуглить и узнать что это все-таки такое и для чего это нужно, но прочитав не мало статей так и не мог до разобраться до конца. В этой статье я постараюсь объяснить вам максимально понятно и приведу примеры.

Что такое __name__ и "__main__"?

Начнем с того, что эта конструкция служит для контролирования кода когда запускается файл с программой. Сама конструкция состоит из двух частей (как не странно): __name__ и "__main__". Разберем их отдельно.
__name__ - это своего рода "волшебная метка", которая меняется в зависимости от ситуации. Например, если ты запускаешь файл напрямую, то твоя программа получает метку __main__ -> "Я главный!". Если твой файл импортируют в другой скрипт или программу, то эта метка становится (переименовывается) именем файла.
"__main__" - это специальный "режим работы", который активируется если ты запускаешь файл напрямую (как главную программу). При запуске твоя программа сразу понимает, что "Я сейчас главный, можно выполнять код!"
Отлично, с этим кое как разобрались, поехали дальше.

Что такое if __name__ == "__main__"



Приведу пример:

-2

Допустим этот небольшой код находится в файле kalkulator.py . Если запустить этот файл, то код внутри if выполнится и мы увидим результат. НО если же импортировать нашу функцию (from kalkulator import add) , то код внутри if не сработает. То есть сама функция add() будет доступна, но вывода результата (print) не будет((

Теперь разберемся для чего эта конструкция.

  • Начнем с того, чтобы наш код не шалил при импорте. Без конструкции if __name__ == "__main__" все команды в файле на примере print будут работать даже при импорте
  • Удобнее тестировать код. Можете писать тесты внутри конструкции, и они будут запускаться только когда вы работаете с этим файлом
  • Делать какую-то многофункциональность. Файл может быть и самостоятельной программой, и набором функций для других скриптов

ИТОГ:
Можно ли обойтись
if __name__ == "__main__"?

Конечно можно, но иногда не желательно. Важность этой конструкции, как важность хлеба к супу - кому-то по кайфу с хлебом, кому-то нет. Но кто-то например не может обойтись без хлеба, потому что не наедается и хочет больше углеводов в своем рационе. Как я уже написал выше, практически вся разница только при импорте, не более.

Я надеюсь, что вам понравилась эта статья и вы наконец-то смогли понять что же это за конструкция такая)))