Специальная переменная __name__ в Python. Часть 2
В прошлой статье мы рассматривали работу специальной переменной __ name __.
В этой статье, мы узнаем, как использовать выражение if __ name __ == "__ main __", и для чего оно нужно.
В прошлый раз мы создали два файла mod_one.py и mod_two.py, и поместили в них проверку на значение, которое __ name __ получает в каждом из модулей. Также выяснили что переменная __ name __ для запускаемого файла/модуля всегда будет __ main __. Но переменная __ name __ для всех других импортируемых модулей будет установлена на имя их модуля.
Обычный способ использования __ name __ и __ main __ выглядит следующим образом:
if __name__ == "__main__":
....
Рассмотрим это на примерах. Для чего создайте файлы mod_one.py и mod_two.py со следующим кодом:
# mod_one:
# coding=utf-8
import mod_two
print("Значение __name__ для mod_one равно: {0}".format(__name__))
if __name__ == "__main__":
print("Файл mod_one выполняется при непосредственном запуске")
else:
print("Файл mod_one выполняется при импорте")
# mod_two:
# coding=utf-8
print("Значение __name__ для mod_two равно: {0}".format(__name__))
if __name__ == "__main__":
print("Файл mod_two выполняется при непосредственном запуске")
else:
print("Файл mod_two выполняется при импорте")
Запуская mod_one вы увидите, что программа распознала, какой из этих двух модулей является __ main__ и выполнила код в соответствии с нашими первыми операторами if else.
Результат должен выглядеть так:
Значение __name__ для mod_two равно: mod_two
Файл mod_two выполняется при импорте
Значение __name__ для mod_one равно: __main__
Файл mod_one выполняется при непосредственном запуске
Запустив файл mod_two напрямую, мы увидим что переменная __ name __, установлена в значении main:
# вывод:
Значение __name__ для mod_two равно: __main__
Файл mod_two выполняется при непосредственном запуске
Когда модуль mod_two, импортируется и запускается, его функции будут импортированы, а код верхнего уровня выполнен.
Чтобы увидеть этот процесс в действии, дополним код:
# mod_two теперь содержит функцию
# coding=utf-8
print("Значение __name__ для mod_two равно: {0}".format(__name__))
def method_three():
print("Функция №3 выполняется")
if __name__ == "__main__":
print("Файл mod_two выполняется при непосредственном запуске")
else:
print("Файл mod_two выполняется при импорте")
# mod_one
# coding=utf-8
import mod_two
def method_one():
print("Выполняется первая функция")
def method_two():
print("Функция вторая выполняется")
print("Значение __name__ для mod_one равно: {0}".format(__name__))
if __name__ == "__main__":
print("Файл mod_one выполняется при непосредственном запуске")
else:
print("Файл mod_one выполняется при импорте")
Теперь функции загружены, но не запущены. И чтобы выполнить одну из функций, изменим часть кода после выражения if __ name __ == "__ main __" в файле mod_one на следующее:
# mod_one
.................
if __name__ == "__main__":
print("Файл mod_one выполняется при непосредственном запуске")
method_two()
else:
print("Файл mod_one выполняется при импорте")
# вывод:
.....................
Функция №2 выполняется
Также можно запустить функции импортируемого модуля из файла mod_one. Для чего модифицируем его еще одной строкой:
if __name__ == "__main__":
print("Файл mod_one выполняется при непосредственном запуске")
method_two()
# вызов функции из модуля mod_two
mod_two.method_three()
else:
print("Файл mod_one выполняется при импорте")
# вывод:
................
Функция №2 выполняется
Функция №3 выполняется
Теперь предположим что файл mod_two содержит множество функций, и мы хотим импортировать только одну. Для начала добавим в файл mod_two вторую функцию:
# coding=utf-8
................
def method_four():
print("Функция №4 выполняется")
if __name__ == "__main__":
print("Файл mod_two выполняется при непосредственном запуске")
else:
print("Файл mod_two выполняется при импорте")
И для импорта конкретных функций из модуля используем блок from import в файле mod_one:
# coding=utf-8
# импорт функции
from mod_two import method_three
.......................
if __name__ == "__main__":
print("Файл mod_one выполняется при непосредственном запуске")
method_two()
# вызов импортированной функции
method_three()
else:
print("Файл mod_one выполняется при импорте")
Таким образом можно предотвратить выполнение некоторого кода из импортируемого модуля, просто поместив его в блок if __ name __ == "__ main __":.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.