Точка входа Python

Точка входа

В программах, написанных на Python часто можно увидеть такую конструкцию:

if __name__ == "__main__":

Это точка входа — место, с которого начинает выполняться ваша программа. Но какие еще значения может принимать переменная __name__? Зачем вообще нужна эта проверка?

Переменная __name__

Для начала, попробуем провести несколько экспериментов. Создадим папку с тремя файлами: my_module.py, calculations.py и processing.py. А теперь выведем на экран переменные __name__ каждого из этих файлов. В каждом случае результат будет одинаковым.

>>> __name__
'__main__'

А теперь попробуем импортировать модули, и снова проверить значение их переменных `__name__`.

```pycon
>>> import my_module
>>> import calculations
>>> my_module.__name__
my_module
>>> calculations.__name__
calculations
>>> .dir()
[..., '__name__', ..., 'calculations', 'my_module']

Как видите, переменная __name__ теперь содержит название файла импортированного модуля. Функция dir() в нашем случае возвращает глобальное пространство имен. В конце списка притаились те самые имена импортированных модулей. Теперь мы сможем обращаться к их содержимому через эти названия.

Точка входа

Давайте разберем работу типичной точки входа на примере файла processing.py.

import calculations
import my_module
def main():
    while True:
        inp = input("Insert value:")
        converted = calculations.convert(inp)
        transformed = calculations.transform(converted)
        print(my_module.output(transformed))
if __name__ == "__main__":
    main()

Сначала интерпретатор импортирует модули, затем определяет функцию main(), и доходит до блока if __name__ == '__main__':. Если пользователь непосредственно запустил файл processing.py, условие будет удовлетворено, и начнется выполнение функции main(). Пользователь сможет ввести какую-то строку в консоль, она будет обработана функциями из модулей calculations и my_module, а затем выведена на экран. Цикл будет повторяться, пока пользователь не завершит программу.

Но представьте себе, что мы решили сделать более сложную программу, которая использует те же функции. Чтобы не переписывать тот же самый код, мы импортировали processing.py. Если бы мы не проверяли значение переменной __name__, функция main() запустилась бы при импорте. Программа застряла бы в одном бесконечном цикле while, а интерпретатор никогда не дошел бы до кода нашей новой программы.

>>> import processing
Insert value:

Это было бы крайне нежелательно. Поэтому мы и проверяем содержимое переменной __name__ перед запуском функции main(). Поскольку при импорте ее содержимое меняется на название модуля - processing, то проверка не будет пройдена, и main() не запустится. Зато мы сможем использовать любые объекты импортированного модуля:

import processing
mode = input('Mode:')
if mode == 'standard':
    processing.main()
else
    print(processing.my_module.output(input()))

Заключение

С точки входа начинается выполнение программы. Содержимое блока if __name__ == '__main__': не выполняется, если файл импортирован, а не запущен напрямую. Это позволяет разместить в нем код, который помешал бы импорту содержимого модуля, но нужен при непосредственном доступе. Использование этой конструкции — хорошая практика, которая поможет избежать проблем при импорте вашего модуля.

Практический Python для начинающих
Практический Python для начинающих

Станьте junior Python программистом за 7 месяцев

 7 месяцев

Возможно будет интересно

🏆 Hello, world! Python
Новичок
🏆 Hello, world!

Мы вчера запустили новый www.pylot.me. Должны были в следующую среду, но запустили вчера.

2022-10-04
Как практиковаться в Python? Python
Новичок
Как практиковаться в Python?

Для улучшения качества знаний и повышения уровня программиста, необходим постоянный практикум. Где можно это организовать самостоятельно, и как практиковаться в Python?

2022-10-19
Условные конструкции и сопоставление структурных шаблонов Шпаргалки
Новичок
Условные конструкции и сопоставление структурных шаблонов

Шпаргалка по условным конструкциям и сопоставлению структурных шаблонов

2022-11-09