• ru
  • Language: en
  • 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__'.

Warning

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