Зачем использовать def main ()? Ru Python
- Ru Python
- стиль кодирования python
- Зачем использовать def main ()?
Возможный дубликат:
Что делать,if __name__== "__main__"
делать?
Я видел несколько примеров кода и учебников, которые используют
def main(): # my code here if __name__ == "__main__": main()
Но почему? Есть ли какая-то причина не определять ваши функции в верхней части файла, а затем просто писать код под ним? т.е.
def my_function() # my code here def my_function_two() # my code here # some code # call function # print(something)
Мне просто интересно, есть ли какая-нибудь рифма в основном?
- Pythonic: диапазон vs перечислять в питоне для цикла
- Когда следует использовать символы подчеркивания между словами в именах функций Python (в соответствии с руководством по стилю)?
- Предпочтительно ли использовать «else» в Python, когда это не обязательно?
- Каков правильный способ разбить вложенные вызовы функций / конструкторов в Python?
- Должен ли я использовать вилку или потоки?
Без главного контролера код будет выполнен, даже если скрипт был импортирован как модуль.
Все остальные уже ответили на это, но я думаю, что мне еще есть что добавить.
Причины иметь это утверждение if
вызывающее main()
(в определенном порядке):
Другие языки (например, C и Java) имеют функцию
main()
которая вызывается при выполнении программы. Используя это,if
мы можем заставить Python вести себя так, как они, что кажется более знакомым для многих людей.Код будет чище , легче читать и лучше организован. (да, я знаю, что это субъективно)
Можно будет
import
этот код python в виде модуля без неприятных побочных эффектов.Это означает, что можно будет запускать тесты против этого кода.
Это означает, что мы можем импортировать этот код в интерактивную оболочку python и тестировать / отлаживать / запускать его.
Переменные внутри
def main
являются локальными , а внешние – глобальными .
Но вам не требуется писать функцию main()
и вызывать ее внутри оператора if
.
Я сам обычно начинаю писать небольшие скрипты без каких-либо функций. Если сценарий становится достаточно большим, или если я чувствую, что всякий код внутри функции мне пригодится, то я реорганизую код и делаю это. Это также происходит, когда я пишу сценарии bash
.
Даже если вы помещаете код внутри основной функции, вам не нужно писать его точно так же. Оптимальным вариантом может быть:
import sys def main(argv): # My code here pass if __name__ == "__main__": main(sys.argv)
Это означает, что вы можете вызывать main()
из других сценариев (или интерактивной оболочки), передавая пользовательские параметры. Это может быть полезно в модульных тестах или при пакетной обработке. Но помните, что в приведенном выше коде потребуется разбор argv, поэтому, возможно, было бы лучше использовать другой вызов, который уже анализирует параметры.
В объектно-ориентированном приложении, которое я написал, код выглядел так:
class MyApplication(something): # My code here if __name__ == "__main__": app = MyApplication() app.run()
Поэтому не стесняйтесь писать код, который вам больше подходит. 🙂
если содержание foo.py
print __name__ if __name__ == '__main__': print 'XXXX'
Файл foo.py можно использовать двумя способами.
- импортировано в другой файл:
import foo
В этом случае __name__
является foo
, секция кода не выполняется и не печатает XXXX
.
- выполняется непосредственно:
python foo.py
Когда он выполняется непосредственно, __name__
__main__
и код в этом разделе выполняется и печатает XXXX
Одна из этих функций позволяет записывать различные модульные тесты в одном модуле.
« Что делать, if __name__==“__main__”:
do? » Уже был дан ответ.
Наличие функции main()
позволяет вам вызывать ее функциональность, если вы import
модуль. Основная (не предназначенная для каламбур) польза от этого (ИМХО) заключается в том, что вы можете его протестировать.
Рассмотрим второй скрипт. Если вы импортируете его в другой, будут выполнены инструкции, как на «глобальном уровне».
- Как получить URL-адрес не-ascii с помощью urlopen Python?
- Как печатать переменные без пробелов между значениями
- Как отступать от списка Python?
- Является ли a, b = b, a + b хорошим питоном?
- Помещение точек с запятой в конце высказываний. Является ли это хорошей / плохой практикой программирования в Python?
- Как вы PEP 8 называете класс, чье имя является аббревиатурой?
- Что такое метод Pythonic для инициализации атрибутов или свойств?
- Стиль Python
- Python: присвоение атрибутов класса boolean / flag
- Получить полную структуру программы?
- Питоновский способ повторения вызова метода на различные конечные аргументы
Функции __name__ и __main__ в Python, запуск кода для начинающих
Предыдущий урок: Namedtuple
В различных руководствах по Python часто используется функция main()
. Но иногда это может быть и лишним.
Лаконичность — важный элемент программирования. И вполне логично задавать вопрос о том, зачем разработчику добавлять лишние строки в программу. Функция main()
требует дополнительных строк, но она служит определенной цели.
В этом материале речь пойдет о функции main()
, о том, какую пользу она приносит, а также о том, как правильно использовать ее в коде.
Что такое функция main()?
Main — это специальная функция, которая позволяет добавить больше логики в структуру программ. В Python можно вызвать функцию в нижней части программы, которая и будет запущена. Рассмотрим такой пример:
Копировать Скопировано Use a different Browser
def cookies():
print("Печенье вкусное!")print("Дайте печенье.")
cookies()
Запустим этот код:
Дайте печенье. Печенье вкусное!
Можно увидеть, что выражение «Дайте печенье.» выводится до «Печенье вкусное!», потому что метод cookies()
не вызывается вплоть до последней строки, а именно в этой функции хранится предложение «Печенье вкусное!».
Такой код работает, но его довольно сложно читать. В таких языках программирования, как C++ и Java весь основной код программы хранится внутри основной функции. Это хороший способ для распределения всего кода программы. Те, кто только знакомится с Python, но уже работал, например, с C++ будут благодарны за использование функции main()
.
Как создать функцию main
Есть две части основной функции Python. Первая — сама функция main()
. В ней хранится код основной программы. Вызовем функцию cookies()
main()
:Копировать Скопировано Use a different Browser
def cookies():
print("Печенье вкусное!")def main():
print("Дайте печенье.")
cookies()
Теперь вызовем функцию в конце программы:
Копировать Скопировано Use a different Browser
main()
Можно запустить код:
Дайте печенье. Печенье вкусное!
Результат не поменялся. Но теперь сам код читать легче. Пусть в нем и больше строк (и одна дополнительная строка), вполне очевидно, что именно происходит:
Cookies()
— функция, которая выводит «Печенье вкусное!».- Когда программа запускается, определяются две функции:
cookies()
иmain()
. - Затем функция
main()
вызывается. - «Дайте печенье.» выводится в консоли.
- Затем вызывается функция
cookies()
, которая выводит в консоль «Печенье вкусное!».
Код не только чище, но и логичнее. Если вы пришли из другого языка, например, Java, но знаете, насколько это удобно.
Значение __name__
Прежде чем переходить к инструкциям __name__
и __main__
, которые часто используются вместе, нужно обсудить __name__
. __name__
хранит название программы.
Если запустить файл прямо, то значением __name__
будет __main__
. Предположим, что файл называется print_name.py
:
Копировать Скопировано Use a different Browser
print(__name__)
Этот код можно запустить следующим образом:
$ python print_name.py
Он вернет __main__
.
Предположим, что этот код был импортирован в качестве модуля в файл main.py
:
Копировать Скопировано Use a different Browser
import print_name
Запустим его:
$ python main.py
Код вернет:
print_name
Код внутри print_name.py
исполняется потому что он был импортирован в качестве модуля в основной программе. Файл print_name
выводит __name__
в консоль. Поскольку print_name
был импортирован в качестве модуля, то и значением __name__
является print_name
.
if __name__ == __main__ в Python
Вы наверняка встречали следующую конструкцию в программах на Python в функции main
:
Копировать Скопировано Use a different Browser
if __name__ == "__main__":
Что она значит? В Python любая переменная, начинающаяся с двух символов нижнего подчеркивания (__
), является специальной. Это зарезервированные значения, которые выполняют определенную роль в программе.
__main__
указывает на область видимости, где будет выполняться код. Если запустить Python-файл прямо, то значением __name__
будет __main__
. Если же его запустить в качестве модуля, то значением будет уже не __main__
, а название модуля.
Это значит, что строка выше вернет True
только в том случае, если программа будет запущена прямо.
Если же ссылаться на файл как на модуль, то содержимое конструкции if не будет выполнено. Рассмотрим на примере.
Как использовать __name__ и __main__
Создадим новый скрипт на Python под названием username.py.
В коде будем просить пользователя ввести его имя и проверять, не является ли его длина больше 5. Если символов не больше 5, то попросим ввести имя снова.
Начнем с определения глобальной переменной для хранения имени пользователя:
Копировать Скопировано Use a different Browser
username = ""
После этого определим две функции. Первая будет просить пользователя ввести имя пользователя и проверять, не больше ли 5 символов в нем. Вторая будет выводить значение в оболочке Python:
Копировать Скопировано Use a different Browser
def choose_username():
global username
username = input("Введите логин: ")
if len(username) > 5:
print("Ваш логин сохранен.")
else:print("Пожалуйста, выберите имя пользователя длиной более пяти символов.")
choose_username()def print_username():
print(username)
В этом примере использовалось ключевое слово global
, чтобы содержимое, присвоенное в методе choose_username()
, было доступно глобально. После определения функций нужно создать main
, которая и будет их вызывать:
Копировать Скопировано Use a different Browser
def main():
choose_username()
print_username()
После этого нужно добавить if __name__="__main__"
в инструкцию if
. Это значит, что при запуске файла прямо, интерпретатор Python исполнит две функции. Если же запустить код в качестве модуля, то содержимое внутри main()
исполнено не будет.
Копировать Скопировано Use a different Browser
if __name__ == "__main__":
main()
Запустим код:
$ python username.py
Он вернет следующее:
Введите логин: mylogin Ваш логин сохранен. mylogin
Этот код запускает функцию choose_username()
, а затем — print_username()
. Если указать имя длиной меньше 4 символов, то ответ будет таким:
Введите логин: Li Ваш логин сохранен. Пожалуйста, выберите имя пользователя длиной более пяти символов. Введите логин:
Будет предложено ввести другое имя. Если импортировать этот код в качестве модуля, то функция main()
не запустится.
Выводы
Функция main()
используется для разделения блоков кода в программе. Использование функции main()
обязательно в таких языках, как Java, потому что это упрощает понимание того, в каком порядке код запускается в программе. В Python функцию main()
писать необязательно, но это улучшает читаемость кода.
Далее: Функция zip()
Немного примеров match/case в Python 3.10 / Хабр
Не так давно (а именно 4 октября 2021 года) официально увидела свет юбилейная версия языка python, а именно версия 3.10. В ней было добавлено несколько изменений, а самым интересным (на мой взгляд) было введение pattern matching statement (оператор сопоставления с шаблонами). Как гласит официальное описание этого оператора в PEP622, разработчики в большей мере вдохновлялись наработками таких языков как: Scala, Erlang, Rust.
Для тех, кто еще не знаком с данным оператором и всей его красотой, предлагаю познакомиться с pattern matching в данной статье.
Немного о pattern matching
Как говорится в официальной документации (PEP622) в Python очень часто требуется проверять данные на соответствие типов, обращаться к данным по индексу и к этим же данным применять проверку на тип. Также зачастую приходится проверять не только тип данных, но и количество, что приводит к появлению огромного числа веток if/else с вызовом функций isinstance, len и обращению к элементам по индексу, ключу или атрибуту. Именно для упрощения работы и уменьшения is/else был введен новый оператор match/case.
Очень важно не путать pattern matching и switch/case, их главное отличие состоит в том, что pattern matching — это не просто оператор для сравнения некоторой переменной со значениями, это целый механизм для проверки данных, их распаковки и управления потоком выполнения.
Давай же рассмотрим несколько примеров, как данный оператор поможет упростить написание кода и сделать код более читаемым.
Примеры
Самый простой пример — это сравнение некоторой переменной со значениями (сначала рассмотрим как это было бы с if/else):
def load(): print("Загружаем") def save(): print("Сохраняем") def default(): print("Неизвестно как обработать") def main(value): if isinstance(value, str) and value == "load": load() elif isinstance(value, str) and value == "save": save() else: default() main("load") >>> Загружаем main("save") >>> Сохраняем main("hello") >>> Неизвестно как обработать
Теперь с match/case:
def main(value): match value: case "load": load() case "save": save() case _: default() main("load") >>> Загружаем main("save") >>> Сохраняем main(5645) >>> Неизвестно как обработать
Стало заметно меньше «and» и «==», получилось избавиться от лишних проверок на тип данных и код стал более понятным, однако это лишь самый простой пример, углубимся дальше. Допустим, откуда-то приходят данные в виде строки, которые записаны с разделителем “~”, и заранее известно, что если в данных было ровно 2 значения, то выполнить одно действие, если 3 значения, то иное действие:
def load(link): print("Загружаем", link) return "hello" def save(link, filename): data = load(link) print("Сохраняем в", filename) def default(values): print("Неизвестно как эти данные обработать") def main(data_string): values = data_string.split("~") if isinstance(values, (list, tuple)) and len(values) == 2 and values[0] == "load": load(values[1]) elif isinstance(values, (list, tuple)) and len(values) == 3 and values[0] == "save": save(values[1], values[2]) else: default(values) main("load~http://example.com/files/test.txt") >>> Загружаем http://example.com/files/test.txt main("save~http://example.com/files/test.txt~file.txt") >>> Загружаем http://example.com/files/test.txt >>> Сохраняем в file. txt main("use~http://example.com/files/test.txt~file.txt") >>> Неизвестно как эти данные обработать main("save~http://example.com/files/test.txt~file.txt~file2.txt") >>> Неизвестно как эти данные обработать
И с match/case:
def main(data_string): values = data_string.split("~") match values: case "load", link: load(link) case "save", link, filename: save(link, filename) case _: default(values) main("load~http://example.com/files/test.txt") >>> Загружаем http://example.com/files/test.txt main("save~http://example.com/files/test.txt~file.txt") >>> Загружаем http://example.com/files/test.txt >>> Сохраняем в file.txt main("use~http://example.com/files/test.txt~file.txt") >>> Неизвестно как эти данные обработать main("save~http://example.com/files/test.txt~file.txt~file2.txt") >>> Неизвестно как эти данные обработать
Также, если есть необходимо скачать несколько файлов:
def load(links): print("Загружаем", links) return "hello" def main(data_string): values = data_string. split("~") match values: case "load", *links: load(links) case _: default(values) main("load~http://example.com/files/test.txt~http://example.com/files/test1.txt") >>> Загружаем ['http://example.com/files/test.txt', 'http://example.com/files/test1.txt']
Match/case сам решает проблему с проверкой типов данных, с проверкой значений и их количеством, что позволяет упростить логику и увеличить читаемость кода. И очень удобно, что можно объявлять переменные и помещать в них значения прямо в ветке case без использования моржового оператора.
Рассмотрим пример, когда необходимо использовать оператор “или” в примере. Допустим, приходит запрос от пользователя с правами, и необходимо проверить, может ли данный пользователь выполнять текущее действие:
def main(data_string): values = data_string.split("~") match values: case name, "1"|"2" as access, request: print(f"Пользователь {name} получил доступ к функции {request} с правами {access}") case _: print("Неудача") main("Daniil~2~load") >>> Пользователь Daniil получил доступ к функции load с правами 2 main("Kris~0~save") >>> Неудача
В таком случае символ “|” выступает в роли логического “или”, а значение прав доступа в переменную access было записано при помощи оператора «as». Разберем аналогичный пример, но в качестве аргумента будем рассматривать словарь:
def main(data_dict): match data_dict: case {"name": str(name), "access": 1|2 as access, "request": request}: print(f"Пользователь {name} получил доступ к функции {request} с правами {access}") case _: print("Неудача") main({"name": "Daniil", "access": 1, "request": "save"}) >>> Пользователь Daniil получил доступ к функции save с правами 1 main({"name": ["Daniil"], "access": 1, "request": "save"}) >>> Неудача main({"name": "Kris", "access": 0, "request": "load"}) >>> Неудача
Как видим, довольно просто делать сравнение шаблонов для словарей. Пойдем еще дальше и создадим класс для хранения всех этих данных, затем попробуем организовать блок match/case для классов:
class UserRequest: def __init__(self, name, access, request): self.name = name self.access = access self.request = request def main(data_class): match data_class: case UserRequest(name=str(name), access=1|2 as access, request=request): print(f"Пользователь {name} получил доступ к функции {request} с правами {access}") case _: print("Неудача") main(UserRequest("Daniil", 1, "delete")) >>> Пользователь Daniil получил доступ к функции delete с правами 1 main(UserRequest(1234, 1, "delete")) >>> Неудача main(UserRequest("Kris", 0, "save")) >>> Неудача
Чтобы еще упростить код и не писать названия атрибутов класса, которые сравниваются, можно прописать в классе атрибут match_args, благодаря которому case будет рассматривать значения, передаваемые при сравнивании в том порядке, в котором они записаны в match_args:
class UserRequest: __match_args__= ('name', 'access', 'request') def __init__(self, name, access, request): self. name = name self.access = access self.request = request def main(data_class): match data_class: case UserRequest(str(name), 1|2 as access, request): print(f"Пользователь {name} получил доступ к функции {request} с правами {access}") case _: print("Неудача") main(UserRequest("Daniil", 1, "delete")) >>> Пользователь Daniil получил доступ к функции delete с правами 1 main(UserRequest(1234, 1, "delete")) >>> Неудача main(UserRequest("Kris", 0, "save")) >>> Неудача
Так же стоить помнить, что при работе case UserRequest(str(name), access=2, request) оператор похож на создание нового экземпляра, однако это так не работает. Рассмотрим пример, подтверждающий это:
class UserRequest: __match_args__= ('name', 'access', 'request') def __init__(self, name, access, request): print("Создан новый UserRequest") self.name = name self.access = access self.request = request def main(data_class): match data_class: case UserRequest(str(name), 1|2 as access, request): print(f"Пользователь {name} получил доступ к функции {request} с правами {access}") case _: print("Неудача") main(UserRequest("Daniil", 1, "delete")) >>> Создан новый UserRequest >>> Пользователь Daniil получил доступ к функции delete с правами 1
Как видно, вызов init произошел всего один раз, поэтому при работе case с классами не создаются новые новые экземпляры классов!
Более сложный и не такой тривиальный пример со сравнением некоторых данных, пришедших в оператор match/case:
class UserRequest: __match_args__= ('name', 'access', 'request') def __init__(self, name, access, request): self. name = name self.access = access self.request = request def main(data_class): match data_class: case UserRequest(_, _, request) if request["func"] == "delete" and request["directory"] == "main_folder": print(f"Нельзя удалять файлы из {request['directory']}") case UserRequest(str(name), 1|2 as access, request) if request["func"] != "delete": print(f"Пользователь {name} получил доступ к файлу {request['file']} с правами {access} на {request['func']}") case _: print("Неудача") main(UserRequest("Daniil", 1, {"func": "delete", "file": "test.txt", "directory": "main_folder"})) >>> Нельзя удалять файлы из main_folder main(UserRequest("Daniil", 1, {"func": "save", "file": "test.txt", "directory": "main_folder"})) >>> Пользователь Daniil получил доступ к файлу test.txt с правами 1 на save
“_” позволяет не объявлять переменную под данные, а просто указывает, что на этом месте должны быть какие-то данные, но их можно не задействовать дальше. Также можно использовать оператор if для того, чтобы добавлять новые условия на проверку шаблона.
Заключение
Новый оператор pattern matching сильно упрощает жизнь во многих моментах и делает код еще более читаемым и лаконичным, что позволяет писать код быстрее и эффективнее не боясь за то, что вдруг где-то в коде не стоит проверка на тип элемента или на количество элементов в списке.
В данной статье были рассмотрены лишь несколько примеров для знакомства с оператором match/case, также существует возможность создавать более детальные и глубокие проверки в шаблонах, поэтому каждому стоит поэкспериментировать с данным оператором, так как, возможно, он позволит вам сделать код еще чище и проще.
Определение основных функций в Python — Real Python
Смотреть сейчас Это руководство содержит соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Определение основных функций в Python
Многие языки программирования имеют специальную функцию, которая автоматически выполняется, когда операционная система запускает программу. Эта функция обычно называется main()
и должна иметь определенный тип возвращаемого значения и аргументы в соответствии со стандартом языка. С другой стороны, интерпретатор Python выполняет сценарии, начиная с верхней части файла, и Python не выполняет никаких определенных функций автоматически.
Тем не менее, наличие определенной начальной точки для выполнения программы полезно для понимания того, как она работает. Программисты Python придумали несколько соглашений для определения этой отправной точки.
К концу этой статьи вы поймете:
- Что такое специальная переменная
__name__
и как Python ее определяет - Почему вы хотите использовать
main()
в Python - Какие соглашения существуют для определения
main()
в Python - Каковы наилучшие методы для того, какой код поместить в ваш
main()
Базовый Python main()
В некоторых сценариях Python вы можете увидеть определение функции и условный оператор, похожий на пример ниже:
по умолчанию main(): print("Привет, мир!") если __name__ == "__main__": главный()
В этом коде есть функция с именем main()
, которая печатает фразу Hello World!
, когда его выполняет интерпретатор Python. Существует также условный (или , если
) оператор, который проверяет значение __name__
и сравнивает его со строкой "__main__"
. Когда оператор if
оценивается как True
, интерпретатор Python выполняет main()
. Вы можете узнать больше об условных операторах в Условных операторах в Python.
Этот шаблон кода довольно часто встречается в файлах Python, которые вы хотите изменить.0004 выполняется как скрипт , а импортируется в другой модуль . Чтобы понять, как будет выполняться этот код, вы должны сначала понять, как интерпретатор Python устанавливает __name__
в зависимости от того, как выполняется код.
Удалить рекламу
Режимы выполнения в Python
Существует два основных способа указать интерпретатору Python выполнить или использовать код:
- Вы можете выполнить файл Python как скрипт с помощью командной строки.
- Вы можете импортировать код из одного файла Python в другой файл или в интерактивный интерпретатор.
Подробнее об этих подходах можно прочитать в разделе Как запускать сценарии Python. Независимо от того, какой способ запуска вашего кода вы используете, Python определяет специальную переменную с именем __name__
, которая содержит строку, значение которой зависит от того, как используется код.
Мы будем использовать этот пример файла, сохраненный как execute_methods.py
, чтобы изучить, как поведение кода меняется в зависимости от контекста:
print("Это мой файл для тестирования методов выполнения Python.") print("Переменная __name__ сообщает мне, в каком контексте работает этот файл.") print("Значение __name__ равно:", repr(__name__))
В этом файле определены три вызова print()
. Первые два печатают вводные фразы. Третий print()
сначала напечатает фразу Значение __name__ равно
, а затем будет напечатано представление переменной __name__
с использованием встроенной функции Python repr()
.
В Python repr()
отображает печатное представление объекта. В этом примере используется repr()
, чтобы подчеркнуть, что значение __name__
является строкой. Вы можете прочитать больше о repr()
в документации Python.
Вы увидите слова файл , модуль и скрипт , используемый в этой статье. Практически особой разницы между ними нет. Однако есть небольшие различия в значении, которые подчеркивают назначение фрагмента кода:
.Файл: Как правило, файл Python — это любой файл, содержащий код. Большинство файлов Python имеют расширение
.py
.Сценарий: Сценарий Python — это файл, который вы собираетесь запускать из командной строки для выполнения задачи.
Модуль: Модуль Python — это файл, который вы собираетесь импортировать из другого модуля или скрипта или из интерактивного интерпретатора. Вы можете узнать больше о модулях в Python Modules and Packages — An Introduction.
Это различие также обсуждается в разделе Как запускать сценарии Python.
Выполнение из командной строки
В этом подходе вы хотите выполнить свой скрипт Python из командной строки.
При выполнении скрипта вы не сможете интерактивно определить код, который выполняет интерпретатор Python. Подробности того, как вы можете запускать Python из командной строки, не так важны для целей этой статьи, но вы можете развернуть поле ниже, чтобы узнать больше о различиях между командной строкой в Windows, Linux и macOS.
Способ, которым вы указываете компьютеру выполнять код из командной строки, немного отличается в зависимости от вашей операционной системы.
В Linux и macOS командная строка обычно выглядит так, как показано в примере ниже:
eleanor@realpython:~/Documents$
Часть перед знаком доллара ( $
) может выглядеть по-разному в зависимости от вашего имени пользователя и имени вашего компьютера. Команды, которые вы вводите, будут идти после $
. В Linux или macOS имя исполняемого файла Python 3 — python3
, поэтому вы должны запускать скрипты Python, набрав python3 script_name.py
после $
.
В Windows командная строка обычно выглядит так, как показано в примере ниже:
C:\Users\Eleanor\Documents>
Часть перед >
может выглядеть по-разному, в зависимости от вашего имени пользователя. Команды, которые вы вводите, будут идти после >
. В Windows имя исполняемого файла Python 3 обычно python
, поэтому вам следует запускать скрипты Python, введя python script_name.py
после >
.
Независимо от вашей операционной системы выходные данные сценариев Python, которые вы используете в этой статье, будут одинаковыми, поэтому в этой статье показан только стиль ввода для Linux и macOS, а строка ввода будет начинаться с $.
.
Теперь вы должны выполнить скрипт execute_methods.py
из командной строки, как показано ниже:
$ python3 execute_methods.py Это мой файл для проверки методов выполнения Python. Переменная __name__ сообщает мне, в каком контексте работает этот файл. Значение __name__: '__main__'
В этом примере вы можете видеть, что __name__
имеет значение '__main__'
, где символы кавычек ( '
) говорят вам, что значение имеет строковый тип.
Помните, что в Python нет разницы между строками, определенными в одинарных кавычках ( '
) и в двойных кавычках ( "
). Вы можете узнать больше об определении строк в Базовых типах данных в Python.
Вы получите идентичный результат, если включите в сценарий строку shebang и выполните ее напрямую ( ./execution_methods.py
), или используйте магию %run
в IPython или Jupyter Notebooks.
Вы также можете увидеть сценарии Python, выполняемые из пакетов, добавив в команду аргумент -m
. Чаще всего это рекомендуется при использовании pip
: python3 -m pip install package_name
.
Добавление аргумента -m
запускает код в модуле __main__.py
пакета. Вы можете найти больше информации о __main__.py
в разделе Как опубликовать пакет Python с открытым исходным кодом в PyPI.
Во всех трех случаях __name__
имеет одно и то же значение: строка '__main__'
.
Техническая деталь: Документация Python конкретно определяет, когда __name__
будет иметь значение '__main__'
:
__name__
модуля устанавливается равным'__main__'
при чтении из стандартного ввода, сценария или интерактивной подсказки. (Источник)
__name__
хранится в глобальном пространстве имен модуля вместе с __doc__
, __package__
и другими атрибутами. Подробнее об этих атрибутах можно прочитать в документации по модели данных Python и, особенно для модулей и пакетов, в документации по импорту Python.
Удаление рекламы
Импорт в модуль или интерактивный интерпретатор
Теперь давайте рассмотрим второй способ, которым интерпретатор Python будет выполнять ваш код: импорт. Когда вы разрабатываете модуль или сценарий, вы, скорее всего, захотите воспользоваться модулями, которые уже созданы кем-то другим, что вы можете сделать с помощью импорт ключевого слова
.
Во время процесса импорта Python выполняет операторы, определенные в указанном модуле (но только в первый раз, когда вы импортируете модуль). Чтобы продемонстрировать результаты импорта файла execute_methods.py
, запустите интерактивный интерпретатор Python, а затем импортируйте файл execute_methods.py
:
>>>
>>> импортировать методы выполнения Это мой файл для проверки методов выполнения Python. Переменная __name__ сообщает мне, в каком контексте работает этот файл. Значение __name__: 'execution_methods'
В этом выводе кода видно, что интерпретатор Python выполняет три вызова print()
. Первые две строки вывода точно такие же, как при выполнении файла как скрипта в командной строке, потому что ни в одной из первых двух строк нет переменных. Однако есть разница в выводе третьего print()
.
Когда интерпретатор Python импортирует код, значение __name__
устанавливается равным имени импортируемого модуля. Вы можете увидеть это в третьей строке вывода выше. __name__
имеет значение 'execution_methods'
, которое является именем файла .py
, из которого Python импортирует.
Обратите внимание, что если вы импортируете
модуль снова, не выходя из Python, вывода не будет.
Лучшие практики для основных функций Python
Теперь, когда вы видите различия в том, как Python обрабатывает различные режимы выполнения, вам будет полезно узнать о некоторых передовых практиках. Они будут применяться всякий раз, когда вы хотите написать код, который можно запускать как сценарий 9.0274 и импортируются в другой модуль или интерактивный сеанс.
Вы узнаете о четырех передовых методах, чтобы убедиться, что ваш код может служить двойной цели:
- Поместите большую часть кода в функцию или класс.
- Используйте
__name__
для управления выполнением вашего кода. - Создайте функцию с именем
main()
, содержащую код, который вы хотите запустить. - Вызов других функций из
main()
.
Поместите большую часть кода в функцию или класс
Помните, что интерпретатор Python выполняет весь код в модуле, когда он импортирует модуль. Иногда код, который вы пишете, будет иметь побочные эффекты, которые вы хотите, чтобы пользователь контролировал, например:
- Выполнение вычисления, которое занимает много времени
- Запись в файл на диск
- Печать информации, которая загромождает терминал пользователя
В этих случаях вы хотите, чтобы пользователь управлял запуском выполнения этого кода, а не позволял интерпретатору Python выполнять код при импорте вашего модуля.
Таким образом, наилучшей практикой является включение большей части кода внутри функции или класса . Это связано с тем, что когда интерпретатор Python встречает ключевые слова def
или class
, он только сохраняет эти определения для последующего использования и фактически не выполняет их, пока вы не сообщите ему об этом.
Сохраните приведенный ниже код в файл с именем best_practices.py
, чтобы продемонстрировать эту идею:
1из времени импорта сна 2 3print("Это мой файл для демонстрации лучших практик.") 4 5def process_data (данные): 6 print("Начало обработки данных...") 7 модифицированные_данные = данные + "которые были изменены" 8 сна(3) 9print("Обработка данных завершена.") 10 вернуть модифицированные_данные
В этом коде вы сначала импортируете sleep()
из модуля time
.
sleep()
приостанавливает интерпретатор на то количество секунд, которое вы укажете в качестве аргумента, и создаст функцию, выполнение которой занимает много времени для этого примера. Затем вы используете print()
для вывода предложения, описывающего цель этого кода.
Затем вы определяете функцию с именем process_data()
, который делает пять вещей:
- Выводит некоторый вывод, чтобы сообщить пользователю, что обработка данных начинается
- Изменяет входные данные
- Приостанавливает выполнение на три секунды, используя
sleep()
- Выводит некоторый вывод, чтобы сообщить пользователю, что обработка завершена
- Возвращает измененные данные
Выполнение файла рекомендаций в командной строке
Что произойдет, если вы запустите этот файл как скрипт в командной строке?
Интерпретатор Python выполнит строки from time import sleep
и print()
, которые находятся за пределами определения функции, затем создаст определение функции с именем process_data()
. Затем скрипт завершится, ничего не делая, потому что в скрипте нет кода, выполняющего process_data()
.
Блок кода ниже показывает результат запуска этого файла как скрипта:
$ python3 best_practices.py Это мой файл для демонстрации лучших практик.
Вывод, который мы видим здесь, является результатом первого print()
. Обратите внимание, что импорт из времени
и определение process_data()
не приводит к результату. В частности, выходные данные вызовов print()
, которые находятся внутри определения process_data()
, не печатаются!
Импорт файла рекомендаций в другой модуль или интерактивный интерпретатор
Когда вы импортируете этот файл в интерактивный сеанс (или другой модуль), интерпретатор Python выполнит точно такие же шаги, как и при выполнении файла как скрипта.
После того, как интерпретатор Python импортирует файл, вы можете использовать любые переменные, классы или функции, определенные в импортированном вами модуле. Чтобы продемонстрировать это, мы будем использовать интерактивный интерпретатор Python. Запустите интерактивный интерпретатор и введите import best_practices
:
>>>
>>> импортировать лучшие_практики Это мой файл для демонстрации лучших практик.
Единственный результат импорта best_practices.py
файл из первого вызова print()
, определенного вне process_data()
. Импорт из времени
и определение process_data()
не приводит к выводу, как и при выполнении кода из командной строки.
Удалить рекламу
Использовать
, если __name__ == "__main__"
для управления выполнением вашего кода Что делать, если вы хотите, чтобы process_data()
выполнялся при запуске сценария из командной строки, но не при импорте файла интерпретатором Python?
Вы можете использовать идиому if __name__ == "__main__"
для определения контекста выполнения и условно запускать process_data()
только тогда, когда __name__
равно "__main__"
. Добавьте приведенный ниже код в конец файла best_practices.py
:
11if __name__ == "__main__": 12 data = "Мои данные считаны из Интернета" 13 печать (данные) 14 модифицированные_данные = данные_процесса(данные) 15 печать (модифицированные_данные)
В этом коде вы добавили условный оператор, который проверяет значение __name__
. Это условное выражение будет оцениваться как True
, когда __name__
равно строке "__main__"
. Помните, что специальное значение "__main__"
для переменной __name__
означает, что интерпретатор Python выполняет ваш скрипт, а не импортирует его.
Внутри условного блока вы добавили четыре строки кода (строки 12, 13, 14 и 15):
- Строки 12 и 13: Вы создаете переменную
data
, которая хранит данные, полученные из Интернета, и распечатываете их. - Строка 14: Вы обрабатываете данные.
- Строка 15: Вы печатаете измененные данные.
Теперь запустите сценарий best_practices.py
из командной строки, чтобы посмотреть, как изменится вывод:
$ python3 best_practices.py Это мой файл для демонстрации лучших практик. Мои данные считываются из Интернета Начало обработки данных... Обработка данных завершена. Мои данные, прочитанные из Интернета, которые были изменены
Во-первых, выходные данные показывают результат вызова print()
за пределами process_data()
.
После этого печатается значение data
. Это произошло из-за того, что переменная __name__
имеет значение "__main__"
, когда интерпретатор Python выполняет файл как скрипт, поэтому условное выражение оценивается как True
.
Затем ваш скрипт вызвал process_data()
и передал data
в для модификации. Когда выполняется process_data()
, он выводит на выход некоторые сообщения о состоянии. Наконец, печатается значение modified_data
.
Теперь вы должны проверить, что происходит, когда вы импортируете файл best_practices.py
из интерактивного интерпретатора (или другого модуля). Пример ниже демонстрирует эту ситуацию:
>>>
>>> импортировать лучшие_практики Это мой файл для демонстрации лучших практик.
Обратите внимание, что вы получаете то же поведение, что и до добавления условного оператора в конец файла! Это связано с тем, что переменная __name__
имела значение "best_practices"
, поэтому Python не выполнял код внутри блока, включая process_data()
, поскольку условный оператор оценен как False
.
Создайте функцию с именем main(), содержащую код, который вы хотите запустить
Теперь вы можете писать код Python, который можно запускать из командной строки в виде скрипта и импортировать без нежелательных побочных эффектов. Далее вы узнаете, как писать свой код, чтобы другим программистам Python было легко понять, что вы имеете в виду.
Многие языки, такие как C, C++, Java и некоторые другие, определяют специальную функцию, которая должна вызываться main()
и которую операционная система автоматически вызывает при выполнении скомпилированной программы. Эту функцию часто называют точкой входа , потому что именно здесь выполнение входит в программу.
Напротив, в Python нет специальной функции, которая служит точкой входа в сценарий. На самом деле вы можете дать функции точки входа в скрипте Python любое имя!
Хотя Python не придает никакого значения функции с именем main()
, в любом случае лучше всего назвать функцию точки входа main()
. Таким образом, любые другие программисты, прочитавшие ваш сценарий, сразу узнают, что эта функция является отправной точкой кода, выполняющего основную задачу сценария.
Кроме того, main()
должен содержать любой код, который вы хотите запустить, когда интерпретатор Python выполняет файл. Это лучше, чем помещать код непосредственно в условный блок, потому что пользователь может повторно использовать main()
, если они импортируют ваш модуль.
Измените файл best_practices.py
, чтобы он выглядел так, как показано ниже:
1из времени импорта сна 2 3print("Это мой файл для демонстрации лучших практик.") 4 5def process_data (данные): 6 print("Начало обработки данных...") 7 модифицированные_данные = данные + "которые были изменены" 8 сна(3) 9 print("Обработка данных завершена.") 10 вернуть модифицированные_данные 11 12def основной(): 13 data = "Мои данные считаны из Интернета" 14 печать (данные) 15 модифицированные_данные = данные_процесса(данные) 16 печать (модифицированные_данные) 17 18if __name__ == "__main__": 19главный()
В этом примере вы добавили определение main()
, которое включает код, ранее находившийся внутри условного блока. Затем вы изменили условный блок, чтобы он выполнял main()
. Если вы запустите этот код как скрипт или импортируете его, вы получите тот же результат, что и в предыдущем разделе.
Удалить рекламу
Вызов других функций из main()
Еще одна распространенная практика в Python: иметь main()
выполнять другие функции вместо включения кода выполнения задачи в main()
. Это особенно полезно, когда вы можете составить свою общую задачу из нескольких небольших подзадач, которые могут выполняться независимо.
Например, у вас может быть сценарий, который делает следующее:
- Считывает файл данных из источника, которым может быть база данных, файл на диске или веб-API
- Обрабатывает данные
- Записывает обработанные данные в другое место
Если вы реализуете каждую из этих подзадач в отдельных функциях, то вам (или другому пользователю) будет легко повторно использовать несколько шагов и игнорировать те, которые вам не нужны. Затем вы можете создать рабочий процесс по умолчанию в main()
и получить лучшее из обоих миров.
Решение о том, следует ли применять эту практику к вашему коду, зависит от вас. Разделение работы на несколько функций упрощает повторное использование, но увеличивает трудности для кого-то другого, пытающегося интерпретировать ваш код, поскольку им приходится следовать нескольким переходам в потоке программы.
Измените файл best_practices.py
, чтобы он выглядел так, как показано ниже:
1из времени импорта сна 2 3print("Это мой файл для демонстрации лучших практик.") 4 5def process_data (данные): 6 print("Начало обработки данных...") 7 модифицированные_данные = данные + "которые были изменены" 8 сна(3) 9 print("Обработка данных завершена.") 10 вернуть модифицированные_данные 11 12def read_data_from_web(): 13 print("Чтение данных из Интернета") 14 data = "Данные из Интернета" 15 возврат данных 16 17def write_data_to_database(данные): 18 print("Запись данных в базу данных") 19печать (данные) 20 21def основная(): 22 данные = read_data_from_web() 23 модифицированные_данные = данные_процесса(данные) 24 write_data_to_database(измененные_данные) 25 26if __name__ == "__main__": 27 основной()
В этом примере кода первые 10 строк файла имеют то же содержимое, что и раньше. Второе определение функции в строке 12 создает и возвращает некоторые образцы данных, а третье определение функции в строке 17 имитирует запись измененных данных в базу данных.
На линии 21, main()
определен. В этом примере вы изменили main()
так, чтобы он по очереди вызывал функции чтения, обработки и записи данных.
Во-первых, данные
создаются из read_data_from_web()
. Эти данные
передаются в process_data()
, который возвращает modified_data
. Наконец, modified_data
передается в write_data_to_database()
.
Последние две строки скрипта — условный блок, проверяющий __name__
и запускает main()
если оператор if
равен True
.
Теперь вы можете запустить весь конвейер обработки из командной строки, как показано ниже:
$ python3 best_practices.py Это мой файл для демонстрации лучших практик. Чтение данных из Интернета Начало обработки данных... Обработка данных завершена. Запись обработанных данных в базу данных Данные из Интернета, которые были изменены
В выводе этого выполнения вы можете видеть, что интерпретатор Python выполнил main()
, который выполнил read_data_from_web()
, process_data()
и write_data_to_database()
. Однако вы также можете импортировать файл best_practices.py
и повторно использовать process_data()
для другого источника входных данных, как показано ниже:
>>>
>>> импортировать best_practices как bp Это мой файл для демонстрации лучших практик. >>> data = "Данные из файла" >>> модифицированные_данные = bp.process_data(данные) Начало обработки данных... Обработка данных завершена. >>> bp.write_data_to_database(modified_data) Запись обработанных данных в базу данных Данные из файла, который был изменен
В этом примере вы импортировали best_practices
и сократили имя до bp
для этого кода.
В процессе импорта интерпретатор Python выполнил все строки кода в файле best_practices.py
, поэтому в выходных данных отображается строка, объясняющая назначение файла.
Затем вы сохранили данные из файла в данных
вместо чтения данных из Интернета. Затем вы повторно использовали process_data()
и write_data_to_database()
из файла best_practices.py
. В этом случае вы воспользовались преимуществом повторного использования кода вместо определения всей логики в main()
.
Сводка рекомендаций по основным функциям Python
Вот четыре ключевых передовых метода работы с main()
в Python, которые вы только что видели:
Поместите код, выполнение которого занимает много времени или оказывает другое влияние на компьютер, в функцию или класс, чтобы вы могли точно контролировать, когда этот код выполняется.
Используйте различные значения
__name__
, чтобы определить контекст и изменить поведение вашего кода с помощью условного оператора.Вы должны назвать функцию точки входа
main()
, чтобы сообщить о назначении функции, даже несмотря на то, что Python не придает особого значения функции с именемmain()
.Если вы хотите повторно использовать функциональность из своего кода, определите логику в функциях вне
main()
и вызывать эти функции в пределахmain()
.
Удалить рекламу
Заключение
Поздравляем! Теперь вы знаете, как создавать функции Python main()
.
Вы узнали следующее:
Знание значения переменной
__name__
важно для написания кода, который выполняет двойную функцию исполняемого скрипта и импортируемого модуля.__имя__
принимает разные значения в зависимости от того, как вы выполнили файл Python.__name__
будет равно:-
"__main__"
, когда файл выполняется из командной строки или с помощьюpython -m
(для выполнения файла пакета__main__. py
) - Имя модуля, если модуль импортируется
-
- Программисты Python разработали набор передовых практик, которые можно использовать, когда вы хотите разработать повторно используемый код.
Теперь вы готовы приступить к написанию потрясающего кода функции Python main()
!
Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Определение основных функций в Python
__main__ — Среда кода верхнего уровня — Документация по Python 3.10.7
В Python специальное имя __main__
используется для двух важных конструкций:
название среды верхнего уровня программы, которую можно проверено с помощью выражения
__name__ == '__main__'
; ифайл
__main__.py
в пакетах Python.
Оба эти механизма связаны с модулями Python; как пользователи взаимодействуют с их и как они взаимодействуют друг с другом. Они подробно объясняются ниже. Если вы новичок в модулях Python, см. раздел учебника. Модули для ознакомления.
__name__ == '__main__'
При импорте модуля или пакета Python __name__
устанавливается на
имя модуля. Обычно это имя самого файла Python без .py
расширение:
>>> импортировать синтаксический анализатор конфигурации >>> configparser.__name__ 'конфигуратор'
Если файл является частью пакета, __name__
также будет включать родительский файл
путь пакета:
>>> из процесса импорта concurrent.futures >>> процесс.__имя__ 'параллельный.фьючерс.процесс'
Однако, если модуль выполняется в среде кода верхнего уровня,
его __name__
устанавливается в строку '__main__'
.
Что такое «среда кода верхнего уровня»?
__main__
— это имя среды, в которой выполняется код верхнего уровня. «Код верхнего уровня» — это первый указанный пользователем модуль Python, который начинает выполняться.
Это «верхний уровень», потому что он импортирует все остальные модули, которые нужны программе.
Иногда «код верхнего уровня» называют точка входа в приложение.
Среда кода верхнего уровня может быть:
объем интерактивной подсказки:
>>> __имя__ '__главный__'
модуль Python, переданный интерпретатору Python в качестве аргумента файла:
$ python3 helloworld.py Привет, мир!
модуль или пакет Python, переданный интерпретатору Python с
-m
аргумент:$ python3 -m архивный файл использование: tarfile.py [-h] [-v] (...)
Код Python, прочитанный интерпретатором Python из стандартного ввода:
$ echo "импортировать это" | питон3 Дзен Python, Тим Питерс Красивое лучше некрасивого. Явное лучше неявного. ...
Код Python, переданный интерпретатору Python с аргументом
-c
:$ python3 -c "импортировать это" Дзен Python, Тим Питерс Красивое лучше некрасивого. Явное лучше неявного. ...
В каждой из этих ситуаций для модуля верхнего уровня __name__
устанавливается значение '__main__'
.
В результате модуль может определить, работает ли он в
среды верхнего уровня путем проверки собственного __name__
, что позволяет
идиома для условного выполнения кода, когда модуль не инициализирован из
заявление об импорте:
, если __name__ == '__main__': # Выполнить, если модуль не инициализирован оператором импорта. ...
См. также
Подробнее о том, как __name__
устанавливается во всех ситуациях, см.
обучающий раздел Модули.
Идиоматическое использование
Некоторые модули содержат код, предназначенный только для использования в сценариях, например для синтаксического анализа. аргументы командной строки или получение данных из стандартного ввода. Если модуль как это было импортировано из другого модуля, например, для модульного теста код скрипта также непреднамеренно выполнится.
Здесь используется , если __name__ == '__main__'
кодовый блок приходит
удобный. Код в этом блоке не будет выполняться, пока модуль не будет выполнен в
среда верхнего уровня.
Размещение как можно меньшего количества операторов в блоке ниже , если __name___ ==
'__main__'
может улучшить ясность и правильность кода. Чаще всего функция
named main
инкапсулирует основное поведение программы:
# эхо.py импортный шлекс импорт системы def echo(фраза: ул) -> Нет: """Фальшивая обертка вокруг печати.""" # для демонстрационных целей вы можете представить, что есть некоторый # полезная и повторно используемая логика внутри этой функции печать (фраза) деф основной () -> интервал: """Эхо входных аргументов для стандартного вывода""" фраза = shlex. join(sys.argv) эхо (фраза) вернуть 0 если __name__ == '__main__': sys.exit(main()) # следующий раздел объясняет использование sys.exit
Обратите внимание, что если модуль не инкапсулировал код внутри основной функции
но вместо этого поместите его непосредственно в блок if __name__ == '__main__'
,
переменная фраза
будет глобальной для всего модуля. Это
подвержены ошибкам, так как другие функции в модуле могут непреднамеренно использовать
глобальная переменная вместо локального имени. Основная функция
решает эту проблему.
проблема.
Использование основной функции
имеет дополнительное преимущество эхо
сама функция
будучи изолированным и импортируемым в другом месте. Когда echo.py
импортируется, эхо
и основные функции
будут определены, но ни одна из них не будет
вызвано, потому что __name__ != '__main__'
.
Рекомендации по упаковке
основные функции
часто используются для создания инструментов командной строки путем указания
их как точки входа для консольных сценариев. Когда это будет сделано,
pip вставляет вызов функции в сценарий шаблона,
где возвращаемое значение main
передается в sys.exit()
.
Например:
sys.exit(основной())
Поскольку вызов main
заключен в sys.exit()
, ожидание
что ваша функция вернет некоторое значение, приемлемое в качестве входных данных для sys.exit()
; как правило, целое число или None
(что неявно
возвращается, если ваша функция не имеет оператора return).
Если мы сами активно будем следовать этому соглашению, наш модуль будет иметь
такое же поведение при прямом запуске (т.е. python3 echo.py
), как это будет, если
позже мы упакуем его как точку входа консольного скрипта в pip-installable
упаковка.
В частности, будьте осторожны с возвратом строк из вашей основной функции
. sys.exit()
будет интерпретировать строковый аргумент как сообщение об ошибке, поэтому
ваша программа будет иметь код выхода 1
, указывающий на сбой, и
строка будет записана в sys. stderr
. Пример echo.py
из
более ранние примеры использования sys.exit(main())
соглашение.
См. также
Руководство пользователя упаковки Python содержит набор руководств и ссылок о том, как распространять и установить пакеты Python с помощью современных инструментов.
__main__.py
в пакетах Python Если вы не знакомы с пакетами Python, см. раздел Пакеты
учебника. Чаще всего файл __main__.py
используется для предоставления
интерфейс командной строки для пакета. Рассмотрим следующую гипотетическую
пакет, «бэндкласс»:
класс группы ├── __init__.py ├── __main__.py └── student.py
__main__.py
будет выполняться при вызове самого пакета
непосредственно из командной строки с помощью флага -m
. Например:
$ python3 -m групповой класс
Эта команда запустит __main__.py
. Как вы используете этот механизм
будет зависеть от характера пакета, который вы пишете, но в этом
гипотетический случай, может иметь смысл позволить учителю искать
студенты:
# класс группы/__main__. py импорт системы из .student импортировать search_students student_name = sys.argv[2] if len(sys.argv) >= 2 else '' print(f'Найден студент: {search_students(student_name)}')
Обратите внимание, что из .student import search_students
является примером относительного
импорт. Этот стиль импорта можно использовать при ссылке на модули в
упаковка. Дополнительные сведения см. в разделе Ссылки внутри пакета в
Раздел «Модули» в учебнике.
Идиоматическое использование
Содержимое __main__.py
обычно не ограждается , если __name__ == '__main__'
блоков. Вместо этого эти файлы сохраняются короткими,
функции для выполнения из других модулей. Затем эти другие модули могут быть
легко тестируются и пригодны для повторного использования.
Если используется, блок if __name__ == '__main__'
будет работать как положено
для файла __main__.py
в пакете, потому что его __name__
атрибут будет включать путь к пакету, если он импортирован:
>>> импортировать asyncio. __main__ >>> asyncio.__main__.__name__ 'асинхронный.__main__'
Это не будет работать для файлов __main__.py
в корневом каталоге файла .zip
хотя. Следовательно, для согласованности минимальный __main__.py
, как venv
один из упомянутых ниже является предпочтительным.
См. также
См. venv
для примера пакета с минимальным __main__.py
в стандартной библиотеке. не содержит , если __name__ == '__main__'
блокировать. Вы можете вызвать его с помощью python3 -m venv [directory]
.
См. runpy
для более подробной информации о флаге -m
для
исполняемый файл интерпретатора.
См. zipapp
, чтобы узнать, как запускать приложения, упакованные в виде файлов .zip . В
в этом случае Python ищет файл __main__.py
в корневом каталоге
архив.
импорт __main__
Независимо от того, с каким модулем была запущена программа Python, другие модули
работающий в той же программе, может импортировать область действия среды верхнего уровня. (пространство имен), импортировав __main__
модуль. Это не импорт
файл __main__.py
, а тот модуль, который получил специальный
имя '__main__'
.
Вот пример модуля, использующего пространство имен __main__
:
# а именно.py импортировать __main__ def did_user_define_their_name(): вернуть 'my_name' в каталоге (__main__) защита print_user_name(): если нет did_user_define_their_name(): поднять ValueError('Определить переменную `my_name`!') если '__file__' в каталоге (__main__): print(__main__.my_name, "найдено в файле", __main__.__file__) еще: печать (__main__.my_name)
Пример использования этого модуля может быть следующим:
# start.py импорт системы из а именно импортировать print_user_name # my_name = "Динсдейл" деф основной(): пытаться: print_user_name() кроме ValueError как ve: вернуть строку (ve) если __name__ == "__main__": sys. exit(основной())
Теперь, если мы запустим нашу программу, результат будет выглядеть так:
$ python3 start.py Определите переменную `my_name`!
Код выхода программы будет равен 1, что указывает на ошибку. Раскомментировать
линия с my_name = "Dinsdale"
исправляет программу, и теперь она завершает работу с
код состояния 0, указывающий на успех:
$ python3 start.py Динсдейл найден в файле /path/to/start.py
Обратите внимание, что импорт __main__
не вызывает проблем с непреднамеренным
запуск кода верхнего уровня, предназначенного для использования в сценариях, который помещается в , если __name__ == "__main__"
блок модуля start
. Почему это работает?
Python вставляет пустой __main__ 9Модуль 0009 в
sys.modules
в
запуск интерпретатора и заполняет его, запуская код верхнего уровня. В нашем примере
это модуль запуска
, который запускается построчно и импортирует , а именно
. В свою очередь, , а именно
импортирует __main__
(что на самом деле start
). это
цикл импорта! К счастью, поскольку частично заполненный __main__
модуль присутствует в sys.modules
, Python передает это , а именно
.
См. Особые замечания для __main__ в
Справочник системы импорта для получения подробной информации о том, как это работает.
Python REPL — еще один пример «среды верхнего уровня», так что все
определенный в REPL, становится частью области __main__
:
>>> импорт именно >>> а именно.did_user_define_their_name() ЛОЖЬ >>> а именно.print_user_name() Traceback (последний последний вызов): ... ValueError: Определите переменную `my_name`! >>> my_name = 'Бармаглот' >>> а именно.did_user_define_their_name() Истинный >>> а именно.print_user_name() бессмыслица
Обратите внимание, что в этом случае область __main__
не содержит __file__
атрибут, поскольку он интерактивен.
Область __main__
используется в реализации pdb
и rlcompleter
.
Какова основная функция Python и как ее использовать
Стать сертифицированным специалистом
Python — один из самых популярных языков программирования для изучения. Основная функция в Python действует как точка выполнения любой программы. Определение основной функции в программировании на Python необходимо для запуска выполнения программы, поскольку она выполняется только тогда, когда программа запускается напрямую, а не выполняется при импорте в виде модуля.
Чтобы лучше понять основную функцию Python, давайте рассмотрим темы, которые я раскрою в этой статье:
- Что такое функции Python?
- Что такое основная функция в Python
- A Basic Python main()
- Режимы выполнения Python
Давайте начнем.
Что такое функции Python?Функция — это блок повторно используемого кода, который формирует основу для выполнения действий на языке программирования. Они используются для выполнения вычислений над входными данными и представления результатов конечному пользователю.
Мы уже узнали, что функция — это фрагмент кода, написанный для выполнения определенной задачи. В Python есть три типа функций, а именно встроенные функции, пользовательские функции и анонимные функции. Теперь функция main похожа на любую другую функцию в Python.
Итак, давайте разберемся, что же такое основная функция в Python.
Что такое основная функция в PythonВ большинстве языков программирования есть специальная функция, которая выполняется автоматически при каждом запуске программы. Это не что иное, как основная функция, или main(), как ее обычно обозначают. По сути, он служит отправной точкой для выполнения программы.
В Python нет необходимости определять основную функцию каждый раз, когда вы пишете программу. Это связано с тем, что интерпретатор Python выполняется с начала файла, если не определена конкретная функция. Следовательно, наличие определенной начальной точки для выполнения вашей программы на Python полезно для лучшего понимания того, как работает ваша программа.
A Basic Python main()В большинстве программ/скриптов Python вы можете увидеть определение функции, за которым следует условное выражение, похожее на пример, показанный ниже:
по умолчанию main(): print("Привет, мир!") если __name__== "__main__" : main()
Узнайте о нашем обучении Python в лучших городах/странах
Нужна ли Python основная функция?
Наличие функции Main в Python не является обязательным, однако в приведенном выше примере вы можете видеть, что есть функция с именем main(). Затем следует условный оператор if, который проверяет значение __name__ и сравнивает его со строкой « __основной__ ". При оценке в True он выполняет main().
И при выполнении выводит «Hello, World!».
Этот тип шаблона кода очень распространен, когда вы имеете дело с файлами, которые должны выполняться как сценарии Python и/или импортироваться в другие модули.
Давайте разберемся, как выполняется этот код. Перед этим очень нужно понимать, что интерпретатор Python устанавливает __name__ в зависимости от того, как выполняется код. Итак, давайте узнаем о режимах выполнения в Python 9.0006
Режимы выполнения PythonСуществует два основных способа указать интерпретатору Python выполнить код:
- Наиболее распространенным способом является выполнение файла как сценария Python.
- Путем импорта необходимого кода из одного файла Python в другой.
Какой бы режим выполнения вы ни выбрали, Python определяет специальную переменную с именем __name__ , которая содержит строку. И, как я уже говорил, значение этой строки зависит от того, как выполняется код.
Иногда, когда вы импортируете из модуля, вам нужно знать, используется ли функция конкретного модуля для импорта или вы просто используете исходный файл . py (скрипт Python) этого модуля.
Для этого в Python есть специальная встроенная переменная с именем __name__ . Этой переменной присваивается строка « __main__ » в зависимости от того, как вы запускаете или выполняете скрипт.
Что такое __main__ в Python?Основная функция Python — это начало любой программы Python. Когда мы запускаем программу, интерпретатор выполняет код последовательно и не будет запускать основную функцию, если она импортирована как модуль, но основная функция выполняется только тогда, когда она запускается как программа Python.
Итак, если вы запускаете скрипт напрямую, Python назначит « __main__ » на __name__ , т. е. __name__ = «__main__». (Это происходит в фоновом режиме).
В результате вы пишете условный оператор if следующим образом:
if __name__ == "__main__" : Логические операторы
Следовательно, если условный оператор оценивается как True, это означает, что файл . py (Python Script) запускается или выполняется напрямую.
Важно понимать, что если вы запускаете что-то непосредственно в оболочке или терминале Python, это условное выражение по умолчанию оказывается истинным.
В результате программисты пишут все необходимые функциональные определения вверху и, наконец, пишут этот оператор в конце, чтобы упорядочить код.
Короче говоря, переменная __name__ помогает вам проверить, запускается ли файл напрямую или он был импортирован.
Есть несколько вещей, о которых следует помнить при написании программ, которые будут выполнять основную функцию. Я перечислил их в четыре простых шага. Вы можете рассматривать это как хорошую номенклатуру, которой следует следовать при написании программ Python, в которых есть основная функция.
- Используйте функции и классы везде, где это возможно.
Мы давно изучаем концепции объектно-ориентированного программирования и их преимущества. Абсолютно необходимо размещать объемные логические коды в компактных функциях или классах. Почему? Для лучшего повторного использования кода, лучшего понимания и общей оптимизации кода. Таким образом, вы можете контролировать выполнение кода, а не позволять интерпретатору Python выполнить его, как только он импортирует модуль.
Давайте посмотрим на следующий фрагмент кода:
защита get_got(): print("…Извлечение данных GOT… n") data="Бран Старк завоевывает Железный трон. n" print("…данные GOT получены…n") возвращаемые данные print("Демонстрация n: использование функций n") получил=получил_получил() распечатать (получил)
В приведенном выше примере я определил функцию с именем « get_got », которая возвращает строку, хранящуюся в переменной «данные». Затем это сохраняется в переменной с именем «got», которая затем распечатывается. Я записал вывод ниже:
- Используйте __name__ для управления выполнением вашего кода.
Теперь вы знаете, что такое переменная __name__ , как и зачем она используется. Давайте посмотрим на фрагмент кода ниже:
Теперь вы знаете, что такое переменная __name__ , как и почему она используется. Давайте посмотрим на фрагмент кода ниже:
, если __name__ == "__main__": got = "Игра престолов показана легендарно" распечатать (получил) new_got = str.split(получено) распечатать (новый_получил)
В приведенном выше примере условный оператор if сравнивает значения переменной __name__ со строкой « __main__ ». Если и только если он оценивается как True, выполняется следующий набор логических операторов. Поскольку мы непосредственно запускаем программу, мы знаем, что условный оператор будет истинным. Следовательно, операторы выполняются, и мы получаем желаемый результат. Таким образом, мы можем использовать переменную __name__ для управления выполнением вашего кода. Вы можете обратиться к выводу, показанному ниже:
- Создайте функцию main() с кодом для запуска.
К настоящему времени вы знаете различные способы выполнения кода Python. Вы также знаете, почему и когда используется функция main(). Пришло время применить его. Посмотрите на следующий фрагмент кода:
. print("Демонстрация основной функции n") демо демо (получено): print("…Начало Игры Престолов…n") new_got = str.split(получено) print("…Игра престолов завершена…n") вернуть new_got деф основной(): got= "n Бран Старк завоевывает Железный трон n" распечатать (получил) new_got = демо (получено) печать (new_got) если __name__ == "__main__": главный()
В приведенном выше примере я использовал определение main(), которое содержит логику программы, которую я хочу запустить. Я также определил функцию под названием «демо», чтобы включить фрагмент кода, который можно повторно использовать по мере необходимости. Кроме того, я изменил условный блок, чтобы он выполнял функцию main().
Таким образом, я помещаю код, который хочу запустить, в main(), логику программирования в функцию под названием «demo» и вызываю main() в условном блоке. Я усвоил вывод кода и записал его ниже для вашего удобства:
Примечание. Если вы запустите этот код как сценарий или импортируете его, результат будет таким же. Вы можете посмотреть на вывод ниже:
- Вызвать другие функции из main().
Когда вы пишете полноценные программы Python, может быть множество функций, которые можно вызывать и использовать. Чаще всего некоторые функции следует вызывать, как только начинается выполнение программы. Следовательно, всегда полезно вызывать другие функции из самой функции main().
Давайте посмотрим на фрагмент кода ниже:
print("Демонстрация основной функции n") демо демо (получено): print("…Начало Game Of Thrones Demo1…n") new_got = str. split(получено) print("…Игра престолов завершена…n") вернуть new_got деф получить (): print("…Получение данных GOT…n") got="Бран Старк завоевывает Железный трон n" print("…данные GOT возвращены…n") вернуть получил деф основной(): получил = получил () распечатать (получил) new_got = демо (получено) печать (new_got) если __name__ == "__main__": главный()
В приведенном выше примере я определил функцию с именем « getgot() » для получения данных. И эта функция вызывается из самого main() .
Следовательно, всегда полезно вызывать другие функции из main() , чтобы составить всю задачу из более мелких подзадач, которые могут выполняться независимо. Я также поделился выводом приведенного выше кода в разделе ниже:
Надеюсь, вы смогли прочитать эту статью и получить четкое представление о том, что такое функция main() в Python и как она работает.