- en
- Language: ru
- Documentation version: latest
if __name__ == "__main__"
Достаточно часто скрипт может выполняться и самостоятельно, и может быть импортирован как модуль другим скриптом. Так как импорт скрипта запускает этот скрипт, часто надо указать, что какие-то строки не должны выполняться при импорте.
В предыдущем примере было два скрипта: check_ip_function.py и get_correct_ip.py. И при запуске get_correct_ip.py, отображались print из check_ip_function.py.
В Python есть специальный прием, который позволяет указать, что какой-то
код не должен выполняться при импорте: все строки, которые находятся
в блоке if __name__ == '__main__'
не выполняются при импорте.
Переменная __name__
- это специальная переменная, которая будет
равна "__main__"
, только если файл запускается как основная программа, и
выставляется равной имени модуля при импорте модуля.
То есть, условие if __name__ == '__main__'
проверяет, был ли
файл запущен напрямую.
Как правило, в блок if __name__ == '__main__'
заносят все вызовы функций
и вывод информации на стандартный поток вывода.
То есть, в скрипте check_ip_function.py в этом блоке будет все, кроме импорта
и функции return_correct_ip:
import ipaddress
def check_ip(ip):
try:
ipaddress.ip_address(ip)
return True
except ValueError as err:
return False
if __name__ == '__main__':
ip1 = '10.1.1.1'
ip2 = '10.1.1'
print('Проверка IP...')
print(ip1, check_ip(ip1))
print(ip2, check_ip(ip2))
Результат выполнения скрипта:
$ python check_ip_function.py
Проверка IP...
10.1.1.1 True
10.1.1 False
При запуске скрипта check_ip_function.py напрямую, выполняются все строки,
так как переменная __name__
в этом случае равна '__main__'
.
Скрипт get_correct_ip.py остается без изменений
from check_ip_function import check_ip
def return_correct_ip(ip_addresses):
correct = []
for ip in ip_addresses:
if check_ip(ip):
correct.append(ip)
return correct
print('Проверка списка IP-адресов')
ip_list = ['10.1.1.1', '8.8.8.8', '2.2.2']
correct = return_correct_ip(ip_list)
print(correct)
Выполнение скрипта get_correct_ip.py выглядит таким образом:
$ python get_correct_ip.py
Проверка списка IP-адресов
['10.1.1.1', '8.8.8.8']
Теперь вывод содержит только информацию из скрипта get_correct_ip.py.
В целом, лучше привыкнуть писать весь код, который вызывает функции и
выводит что-то на стандартный поток вывода, внутри блока
if __name__ == '__main__'
.
Предупреждение
Начиная с 9 раздела, для заданий есть программные тесты,
с помощью которых можно проверить правильность выполнения заданий.
Для корректной работы с тестами, надо всегда писать вызов функции
в файле задания внутри блока if __name__ == '__main__'
.
Отсутствие этого блока будет вызывать ошибки, не во всех заданиях,
однако это все равно позволит избежать проблем.