Зачем это нужно?

Возможно, вы уже видели это раньше: синтаксис, который часто игнорируется, потому что кажется, что он не мешает выполнению вашего кода. Это может показаться необязательным, но это только в том случае, если вы работаете с одним файлом Python.

Давайте приступим к делу!

Давайте начнем с деконструкции утверждения слева направо. Мы уже знаем, что такое оператор if ; однако самая важная часть утверждения - это две сравниваемые вещи.

Начнем с __name__. Он используется для обозначения имени файла, который в данный момент запускается, но здесь есть одна хитрость. Текущий файл всегда будет иметь значение __main__.

Сначала это звучит сбивающе с толку, но давайте внесем ясность.

Давайте создадим два файла Python:

  • current_script.py
  • other_script.py

Убедитесь, что эти файлы находятся в одном каталоге / папке.

Внутри файла other_script.py мы добавим инструкцию с двумя выводами, как показано ниже.

print("****inside other script.py*****")
print("__name__ is ",__name__)

Запустите этот other_script.py файл.

Примечание. Я буду запускать этот файл при использовании Python в терминале, как показано ниже. Также обратите внимание, что я работаю в операционной системе Windows.

python other_script.py

Выход:

****inside other script.py*****
__name__ is  __main__

Теперь вы понимаете, что все именно так, как я уже говорил. Выполняемый файл всегда будет иметь значение __main__. Это точка входа в наше приложение.

В Python и почти на всех языках программирования мы можем импортировать другие файлы в наше приложение. Теперь перейдем к нашему current_script.py и введем следующий код:

import other_script
print("")
print("****inside current script.py*****")
print("__name__ is ",__name__)

Приведенный выше код импортирует other_script.py с оператором import вверху, за которым следует print(“****inside current script.py*****”), чтобы убедиться, что мы находимся в файлеcurrent_script.py.

Имейте в виду, что, поскольку мы импортировали other_script в верхней части файла, это означает, что все содержимое other_script.py теперь будет вставлено туда, где находится import other_script.

Прежде чем мы продолжим, внимательно обратите внимание на ввод, когда мы запускали other_script.py. Теперь посмотрим, что происходит, когда мы выполняем current_script.py.

python current_script.py

Выход:

****inside other script.py*****
__name__ is  other_script
****inside current script.py*****
__name__ is  __main__

Теперь вы понимаете, что раньше, когда мы запускали other_script.py, он давал нам значение для __name__ как __main__. Но теперь, когда мы запустили его как импорт в current_script.py, значение __name__ внезапно изменилось на имя импортированного скрипта, равное other_script.

Кроме того, значение __name__ для current_script.py равно __main__. Это восходит к тому, что я выделил ранее: текущий файл всегда будет иметь значение __main__.

Давайте теперь соберем все это вместе.

Текущий файл всегда будет __main__, в то время как любые другие импортированные файлы не будут. У них будут имена соответствующих файлов.

Случаи применения

Этот синтаксис пригодится, если у вас есть программы с несколькими файлами Python.

Давайте создадим программу с двумя классами. Класс Name и класс Person. Эти два класса будут помещены в два отдельных файла, name.py и person.py. Класс Person использует в этой системе классName.

Мы начнем с создания класса Name в файле name.py. Это простой класс, который имеет только два атрибута, fname (имя) и lname (фамилия), а также соответствующие им геттеры и сеттеры.

__repr__ - вывод по умолчанию при печати объекта.

Мы добавили наш синтаксис if__name__ == “__main__:”. Основываясь на нашем понимании, мы можем сказать, что тело этого оператора if будет выполняться только в том случае, если выполняется главный файл, то есть это не импорт.

Но зачем мы это делаем?

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

Выход:

fname=Jordan;lname=Williams

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

Давайте создадим наш person.py файл.

Обратите внимание на from name import Name, где я импортировал Name class в наш файл, он использовался в строке 7, гдеself.name = Name(fname, lname).

Выход:

201107
John Brown
Male

Это результат тестирования нашего Person класса. Обратите внимание, что класс Name не выводит данные, потому что он заключен в условие __name__ == “__main__” и в настоящее время не является основным файлом.

Теперь удалим __name__ == “__main__” из name.py и увидим разницу:

Обратите внимание, что __name__ == “__main__” не удаляется. Теперь мы запустим наш person.py файл.

Выход:

fname=Jordan;lname=Williams
201107
John Brown
Male

Видите ли, здесь мы хотели только проверить функциональность класса Person. Однако мы также получаем выходные данные от класса Name.

Это также может быть проблемой, если вы создали некоторую библиотеку Python и хотите расширить эту функциональность до другого класса, но не хотите, чтобы эта другая библиотека запускалась автоматически в вашем текущем скрипте.

Другие языки

Некоторые из вас, кто занимается другими языками программирования, возможно, заметили, что это то же самое, что и основной метод или функции других языков. Все языки программирования, такие как Java с public static void main(String[] args), C # с аналогичным public static void Main (string[] args) и C с int main(void), имеют какую-то основную функцию или метод для выполнения нескольких файлов / сценариев кода.

Давайте посмотрим на эквивалентный код на другом языке.

Возьмем, к примеру, Java.

Резюме

Иногда вы хотите запустить некоторую логику только в текущем исполняемом файле. Это удобно при тестировании отдельных модулей кода без препятствий для выполнения других файлов. Это может пригодиться при создании библиотек, которые зависят от других библиотек. Вы бы не хотели мошеннического выполнения другой библиотеки в коде, в котором вы находитесь.