№37 Функция __main__ / для начинающих
Лаконичность — важный элемент программирования. И вполне логично задавать вопрос о том, зачем разработчику добавлять лишние строки в программу. Функция main() требует дополнительных строк, но она служит определенной цели.
Что такое функция main()?
Main — это специальная функция, которая позволяет добавить больше логики в структуру программ. В Python можно вызвать функцию в нижней части программы, которая и будет запущена. Рассмотрим такой пример:
Можно увидеть, что выражение «Дайте печенье.» выводится до «Печенье вкусное!», потому что метод cookies() не вызывается вплоть до последней строки, а именно в этой функции хранится предложение «Печенье вкусное!».
Как создать функцию main
Теперь вызовем функцию в конце программы:
Можно запустить код:
Результат не поменялся. Но теперь сам код читать легче. Пусть в нем и больше строк (и одна дополнительная строка), вполне очевидно, что именно происходит:
Код не только чище, но и логичнее. Если вы пришли из другого языка, например, Java, но знаете, насколько это удобно.
Значение __name__
Этот код можно запустить следующим образом:
Предположим, что этот код был импортирован в качестве модуля в файл main.py :
if __name__ == __main__ в Python
Вы наверняка встречали следующую конструкцию в программах на Python в функции main :
Что она значит? В Python любая переменная, начинающаяся с двух символов нижнего подчеркивания ( __ ), является специальной. Это зарезервированные значения, которые выполняют определенную роль в программе.
Это значит, что строка выше вернет True только в том случае, если программа будет запущена прямо.
Если же ссылаться на файл как на модуль, то содержимое конструкции if не будет выполнено. Рассмотрим на примере.
Как использовать __name__ и __main__
Создадим новый скрипт на Python под названием username.py. В коде будем просить пользователя ввести его имя и проверять, не является ли его длина больше 5. Если символов не больше 5, то попросим ввести имя снова.
Начнем с определения глобальной переменной для хранения имени пользователя:
Что делает if __name__ == «__main__»: в Python?
Вы наверняка не раз видели и даже использовали эту строку кода:
Знаете ли вы, что она делает и зачем она нужна? Давайте разберемся.
Когда интерпретатор Python читает исходный код из файла, он выполняет весь код внутри этого файла. Даже если это просто импорт библиотеки.
Однако бывают случаи, когда мы не хотим выполнять весь код в файле, а хотим импортировать класс или функцию.
Чтобы предотвратить такую ситуацию, интерпретатор Python предоставляет вам переменную __name__.
Эта переменная обычно содержит следующие значения:
Давайте рассмотрим пример.
Example.py
В качестве примера рассмотрим следующий код.
Специальные параметры
Посмотрим на содержимое __name__ в зависимости от способа выполнения модуля example.py.
Когда ваш модуль является основной программой
Если вы запустите свой модуль в качестве основной программы:
Интерпретатор присвоит значение __main__ переменной __name__. Точно так же, как если бы первая строка кода в вашем файле была:
Что произойдет, если вы запустите файл? Вы получите следующие сообщения:
Когда ваш модуль импортируется другим
Предположим, что example.py не является основным модулем, а импортирован из другого. Например, если мы импортируем его из консоли Python:
Интерпретатор будет искать ваш файл example.py и перед выполнением вашего модуля присвоит переменной name значение example, как если бы следующая строка была выполнена в начале вашего файла:
В качестве итога.
Вы можете использовать if name == ‘main‘: для защиты части кода. Таким образом, вы можете быть уверены, что блок будет выполнен только в том случае, если ваш модуль является основной программой.
Зачем это нужно?
Бывают случаи, когда вы хотите написать модуль Python, который может быть импортирован другими программами и может быть использован в качестве основной программы. Например:
Использование if __name__ == «__main__» в Python
В данном руководстве мы рассмотрим для чего используется условие if name == «__main__» в Python, и в каких случаях оно нам может пригодиться.
Введение
Это стандартный код, который защищает пользователей от случайного вызова сценария, когда они не собирались этого делать, и его применение является хорошей практикой.
Это имеет значение для этих двух случаев использования:
В последнем случае обычно мы хотим только импортировать модуль, а затем позже в коде выполнить некоторые функции или использовать класс из этого файла. Именно здесь вступает в игру оператор if __name__ == «main», который работает как защитник.
Давайте выясним, почему и как это работает.
Специальная переменная
Когда интерпретатор Python читает исходный файл, он делает две вещи:
Давайте посмотрим на следующий пример, где мы правильно используем оператор if __name__ == «main»:
Первый случай использования
Запустите его как основную программу с помощью python testa.py.
Интерпретатор Python присвоит переменной __name__ жестко закодированную строку «main», и таким образом код в операторе if будет выполнен:
Второй случай использования
Импортируйте testa в качестве модуля.
Интерпретатор присвоит «testa» переменной __name__ в модуле testa. Таким образом, код в операторе if не будет выполнен, и func_one не запустится.
Без if __name__ == «main» в testa.py вывод был бы следующим:
Обычно это не то, что нам нужно. Поэтому, если вы хотите запустить код в файле, хорошей практикой будет обернуть весь этот код в оператор if __name__ == «main».
Заключение
В этой статье мы рассмотрели различные способы использования инструкции if __name__ == «main». Научились применять их на практики и теперь знаем как использовать их у себя в проекте.
Функция main() в Python – примеры использования
В этом руководстве мы узнаем о функции main() в языке программирования Python. И разберем, как мы можем использовать атрибут __name__ в программе Python, чтобы динамически выполнять его в различных контекстах. Давайте начнем с определения функции main() в Python.
Что такое функция main() в Python?
Функция main() в Python считается уникальной функцией для нескольких языков программирования, также называемой точкой выполнения для файла программы. Однако интерпретатор языка программирования Python выполняет каждую из строк последовательно, начиная с верхней части файла, и не имеет явной функции main().
Python предоставляет другие способы для определения точки выполнения. Один из них использует функцию main() вместе со свойством __name__ файла python.
Теперь давайте разберемся с переменной __name__ в языке программирования Python.
Что такое аргумент __name__ в Python?
Аргумент __name__ в Python – это уникальная основная переменная, которая отображает имя текущего модуля.
Это свойство предлагает разные значения в зависимости от того, где мы запускаем файл Python. Давайте рассмотрим пример, чтобы лучше понять свойство __name__.
Выполнение файла Python как скрипта
Допустим, у нас есть файл Python, известный как myworld.py, содержащий следующее содержимое:
В приведенном выше программном файле мы напечатали значение свойства __name__. В результате значение переменной __name__ устанавливается на __main__.
Выполнение файла Python как модуля
Мы также можем выполнить файл Python как модуль. Для этого нам нужно импортировать требуемый файл в другую программу Python. Давайте рассмотрим следующий пример, чтобы правильно понять концепцию.
Предположим, что мы создали файл Python как python_main.py в том же каталоге, что и файл myworld.py со следующим содержимым:
В приведенном выше программном файле мы импортировали модуль как myworld. В результате, когда мы выполняли файл python_main.py, программа запускала полный код в файле модуля. Однако мы можем заметить, что вместо __main__ отображается имя модуля myworld.
Это происходит потому, что в контексте выполнения файла Python как модуля само имя модуля присваивается переменной __name__.
Использование оператора if с переменной __name__
Поскольку мы уже поняли, как присваиваются значения свойству __name__, мы можем использовать оператор if, чтобы запускать один и тот же файл Python по-разному в разных контекстах.
Давайте рассмотрим следующий пример, в котором мы изменили содержимое файла myworld.py.
В приведенном выше фрагменте кода мы определили функцию main() для печати некоторых строк для пользователей. Затем мы использовали условное предложение if, чтобы проверить, равно ли значение переменной __name__ __main__, после чего будет выполнена функция main(). В результате, когда мы выполняем файл myworld.py, для пользователя печатается строковое сообщение.
Однако, когда мы выполняем файл как модуль, импортируя его в python_main.py, программа не возвращает никаких результатов, поскольку функция main() не вызывается.
Таким образом, мы можем заключить, что пользовательская функция main(), которую мы определили в файле myworld.py, может выполняться только как автономный скрипт, но не как импортированный модуль.
Это стандартный метод явного определения функции main() в Python и один из самых популярных вариантов использования свойства __name__ файла Python.
Что такое if __name__ == ‘__main__’ (if name main в языке Python)
Конструкци if __name__ == ‘__main__’: main() в Python определяет какая функция будет исполняться в качестве основной. Обычно это main().
В Python есть понятие namespace. main — основной namespace, с ним происходит работа из оболочки, каждый импортируемый модуль относится к другому namespace, имя которого совпадает с именем модуля.
Если пишется простой CGI скрипт на питоне можно не указывать «if name main». Скрипт при этом будет успешно отрабатывать если выполнять его из консоли или, например, поместить в CRON.
Значение у «if name main» появляется тогда когда написанный скрипт/модуль импортируется для того, чтобы использоваться в других программах.
Напишет простой скрипт test.py
if __name__ == ‘__main__’:
print (‘No module’)
else:
print (‘Running where imported a module’)
Теперь проведем два эксперимента. Сначала обратимся к скрипту из консоли:
No module
Теперь авторизуемся в оболочке Python
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type «help», «copyright», «credits» or «license» for more information.
И импортируем модуль
Running where imported a module
Конструкция определяющая какой фрагмент кода исполнять фактически всегда указывается последней строкой в скрипте, ниже еще один пример
def main():
print («It’s from main function»)
if __name__ == ‘__main__’: main()
Выполняем скрипт из консоли
It’s from main function
Строка выводится, если модуль импортировать действия указанного для функции не произойдет. Оно выполнится только если фактически будет обращение
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type «help», «copyright», «credits» or «license» for more information.
На этом этапе строки не выводится. Также не будут выполнены никакие участки настоящей программы.
Чтобы выполнение произошло нужно обратиться к функции.
It’s from main function
Таким образом, if __name__ == ‘__main__’ в питоне используется для того чтобы предотвратить мгновенное выполнение участков программного кода сразу при импортировании модулей что происходило бы без этой конструкции.



