If name main python что это
![]()
Конструкция if __name__ == ‘__main__’ в Python: как использовать и когда
02 апреля 2023
Оценки статьи
Еще никто не оценил статью
Конструкция if name == ‘main’ — это часто используемый фрагмент кода в Python, который проверяет, запускается ли текущий файл напрямую или импортируется в другой модуль. Эта конструкция позволяет разработчикам определять, какие действия должны выполняться при запуске файла, и какие — при импорте.
Что означает name в if name == ‘main’?
В Python переменная name является специальной переменной, которая хранит имя текущего модуля. Если модуль запущен напрямую, name будет равен «main» . Если модуль импортируется в другой модуль, name будет равен имени этого модуля.
Для чего используется конструкция if name == ‘main’?
Конструкция if name == ‘main’ позволяет разработчикам разделять код, который выполняется при запуске файла напрямую, и код, который выполняется при импорте файла.
Когда мы импортируем модуль, мы хотим, чтобы код внутри модуля выполнялся только один раз. Например, мы импортируем модуль, который содержит функции для работы с базой данных, и мы хотим вызвать одну из этих функций в нашем скрипте.
Мы не хотим, чтобы каждый раз, когда мы импортируем этот модуль, выполнялось подключение к базе данных. В этом случае мы можем использовать конструкцию if name == ‘main’ для того, чтобы код, который не должен выполняться при импорте модуля, остался внутри условия.
Пример использования конструкции if name == ‘main’
Предположим, у нас есть модуль с именем my_module , который содержит функцию add_numbers() .
Мы хотим вызвать эту функцию из скрипта, который мы запустим напрямую, но мы не хотим, чтобы эта функция вызывалась, когда мы импортируем модуль в другой скрипт.
# Модуль my_module def add_numbers(a, b): return a + b if __name__ == '__main__': # Код, который будет выполняться только при запуске файла напрямую print(add_numbers(1, 2))
В данном примере, если мы запустим my_module напрямую, то функция add_numbers() будет вызвана и результат 3 будет выведен на экран. Если же мы импортируем my_module в другой скрипт, функция add_numbers() не будет вызвана.
Рассмотрим пример простой программы на Python, которая выводит на экран приветствие пользователю:
def say_hello(): print("Hello, user!") say_hello()
При запуске этой программы на выполнение мы увидим, что на экран будет выведено сообщение «Hello, user!». Однако, если мы будем использовать этот код в качестве модуля для импорта в другой скрипт, то функция say_hello() будет выполнена автоматически при импорте модуля, и сообщение будет выведено независимо от того, нужно ли нам его выводить в данном случае. Для того чтобы избежать этого, можно использовать конструкцию if name == ‘main’:
def say_hello(): print("Hello, user!") if __name__ == '__main__': say_hello()
Теперь функция say_hello() будет выполнена только если скрипт запущен непосредственно (как основная программа), а не импортирован как модуль в другой скрипт.
Пример с использованием параметров командной строки:
import sys def main(arg): print("Hello,", arg) if __name__ == '__main__': arg = sys.argv[1] main(arg)
Эта программа получает один аргумент из командной строки и выводит на экран сообщение с этим аргументом. Если мы запустим ее без аргумента, то получим ошибку IndexError: list index out of range , потому что список sys.argv будет пустым. Чтобы избежать этой ошибки, можно использовать конструкцию if name == ‘main’:
import sys def main(arg): print("Hello,", arg) if __name__ == '__main__': if len(sys.argv) > 1: arg = sys.argv[1] main(arg) else: print("Usage: python hello.py ")
Теперь программа проверяет наличие аргументов в списке sys.argv и выводит на экран сообщение об использовании, если аргументов нет. Если аргумент есть, то функция main() будет выполнена с этим аргументом.
Заключение
Конструкция if name == ‘main’ является важной частью любой программы на Python. Она позволяет определить, какая часть кода должна быть выполнена при запуске скрипта, а какая — при импорте модуля. Это помогает избежать ошибок и сделать код более понятным и удобным для использования.
Меню категорий
-
Загрузка категорий.
Добро пожаловать в Блог Разработчика Владислава Александровича.
Ведется медленная, но уверенная разработка функционала сайта.
Django Core: 0.3.4 / Next.js 1.0 / UPD: 05.06.2023
№37 Функция __main__ / для начинающих
В различных руководствах по Python часто используется функция main() . Но иногда это может быть и лишним.
Лаконичность — важный элемент программирования. И вполне логично задавать вопрос о том, зачем разработчику добавлять лишние строки в программу. Функция main() требует дополнительных строк, но она служит определенной цели.
В этом материале речь пойдет о функции main() , о том, какую пользу она приносит, а также о том, как правильно использовать ее в коде.
Что такое функция main()?
Main — это специальная функция, которая позволяет добавить больше логики в структуру программ. В Python можно вызвать функцию в нижней части программы, которая и будет запущена. Рассмотрим такой пример:
def cookies():
print("Печенье вкусное!")
print("Дайте печенье.")
cookies()Запустим этот код:
Дайте печенье. Печенье вкусное!Можно увидеть, что выражение «Дайте печенье.» выводится до «Печенье вкусное!», потому что метод cookies() не вызывается вплоть до последней строки, а именно в этой функции хранится предложение «Печенье вкусное!».
Такой код работает, но его довольно сложно читать. В таких языках программирования, как C++ и Java весь основной код программы хранится внутри основной функции. Это хороший способ для распределения всего кода программы. Те, кто только знакомится с Python, но уже работал, например, с C++ будут благодарны за использование функции main() .
Как создать функцию main
Есть две части основной функции Python. Первая — сама функция main() . В ней хранится код основной программы. Вызовем функцию cookies() и выведем выражение «Дайте печенье.» из функции main() :
def cookies():
print("Печенье вкусное!")
def main():
print("Дайте печенье.")
cookies()Теперь вызовем функцию в конце программы:
main()Можно запустить код:
Дайте печенье. Печенье вкусное!Результат не поменялся. Но теперь сам код читать легче. Пусть в нем и больше строк (и одна дополнительная строка), вполне очевидно, что именно происходит:
- Cookies() — функция, которая выводит «Печенье вкусное!».
- Когда программа запускается, определяются две функции: cookies() и main() .
- Затем функция main() вызывается.
- «Дайте печенье.» выводится в консоли.
- Затем вызывается функция cookies() , которая выводит в консоль «Печенье вкусное!».
Код не только чище, но и логичнее. Если вы пришли из другого языка, например, Java, но знаете, насколько это удобно.
Значение __name__
Прежде чем переходить к инструкциям __name__ и __main__ , которые часто используются вместе, нужно обсудить __name__ . __name__ хранит название программы.
Если запустить файл прямо, то значением __name__ будет __main__ . Предположим, что файл называется print_name.py :
print(__name__)Этот код можно запустить следующим образом:
$ python print_name.pyОн вернет __main__ .
Предположим, что этот код был импортирован в качестве модуля в файл main.py :
import print_name$ python main.pyprint_nameКод внутри print_name.py исполняется потому что он был импортирован в качестве модуля в основной программе. Файл print_name выводит __name__ в консоль. Поскольку print_name был импортирован в качестве модуля, то и значением __name__ является print_name .
if __name__ == __main__ в Python
Вы наверняка встречали следующую конструкцию в программах на Python в функции main :
if __name__ == "__main__":Что она значит? В Python любая переменная, начинающаяся с двух символов нижнего подчеркивания ( __ ), является специальной. Это зарезервированные значения, которые выполняют определенную роль в программе.
__main__ указывает на область видимости, где будет выполняться код. Если запустить Python-файл прямо, то значением __name__ будет __main__ . Если же его запустить в качестве модуля, то значением будет уже не __main__ , а название модуля.
Это значит, что строка выше вернет True только в том случае, если программа будет запущена прямо.
Если же ссылаться на файл как на модуль, то содержимое конструкции if не будет выполнено. Рассмотрим на примере.
Как использовать __name__ и __main__
Создадим новый скрипт на Python под названием username.py. В коде будем просить пользователя ввести его имя и проверять, не является ли его длина больше 5. Если символов не больше 5, то попросим ввести имя снова.
Начнем с определения глобальной переменной для хранения имени пользователя:
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__' . Отсутствие этого блока будет вызывать ошибки, не во всех заданиях, однако это все равно позволит избежать проблем.
Зачем __name__ == "__main__"?
В этой небольшой статье мы рассмотрим один из самых популярных "новичковых" вопросов - зачем нам конструкция if __name__ == "__main__".
Эта статья ориентирована на начинающих разработчиков, я пытаюсь объяснить тему максимально понятно и доступно. Поэтому где-то лукавлю, где-то преувеличиваю, но это для лучшего понимания, не кидайтесь ананасами 🙂
Прежде чем изучить конструкцию if __ name__ == __"main__", необходимо знать несколько вещей:
- Интерпретатор Python выполняет весь код, который сможет найти в файле.
- Когда Python запускает "исходный файл" в качестве основной программы, он присваивает переменной __name__ значение __main__
В языках программирования существует такое понятие, как точка входа. В некоторых языках программирования (C, C#, Go) конструкция if __name__ = не требуется, потому что в самом начале разработки задается точка входа, без нее компилятор выдаст ошибку. Python же относится к этому лояльно и позволяет пользователю не указывать точку входу (Python в качестве точки входа считает первую строку), что может приводить к серьезным проблемам.
Также данная конструкция позволяет разделять файлы, чтобы они не пересекались при одновременной работе (при импорте модуля, либо при запуске самого модуля).
Например, у нас есть две программы:
- (test.py) выводит значение переменной __name__, а затем строку "Hello world".
- (test_2.py) импортирует модуль test.
Если в качестве исходной (откуда происходит запуск) программы мы выберем test.py, то на выводе получаем следующее:

Так как в качестве исходной программы мы выбрали test.py, интерпретатор Python присвоил значение переменной __name__: __main__. Теперь попробуем запустить test_2.py.

Как видим, вместо __main__ мы получили test. Почему это произошло? Потому что мы запустили модуль test, в котором есть строка print(__name__), но так как мы запустили этот код из другой программы (test_2.py), интерпретатор не вывел __main__.
Проще говоря, если мы запускаем программу через «побочную» программу, то переменной __name__ не будет задаваться значение __main__, что позволяет избежать лишнего срабатывания кода. Например:

Мы запустили файл test.py и получили на вывод результат сложения двух чисел и их разность. Также в конце вывели строку, говорящую, что запуск выполнен с помощью test.py. Если же мы импортирует этот модуль в программу test_2.py, то получим на вывод следующее:

А именно сообщение, что мы выполнили действия с помощью test.py, хотя в действительности это не так, ведь мы использовали test_2.py, а не test.py. Чтобы избежать подобного «лишнего» срабатывания фрагментов кода, необходимо в исходном файле (модуле) дописать конструкцию if __name__ == “__main__”. Должно получиться вот так:

Теперь при импортировании модуля test в test_2.py будет выполняться проверка значения переменной __name__. Запускаем наш test_2.py и видим, что теперь срабатывания print(“успешно выполнено с помощью test.py”) не произошло.

Благодарю за прочтение статьи, надеюсь вы подчерпнули из неё что-то новое.
Пишите в комменты какую тему разобрать в следующий раз, всем добра!