Сигурно сте попадали на конструкцията if __name__ == "main" в Python. Но знаете ли точното му предназначение?

В някои езици за програмиране основният метод служи като единствената входна точка за изпълнение на програма. Докато преминавате от други езици към Python, идиомът if __name__ == "__main__" може да изглежда, че изпълнява същата задача. В Python това не е така.

The if __name__ == "__main__" idiom позволява изпълнението на специфичен код, когато файлът се изпълнява като скрипт. Той също така гарантира, че същият код не се изпълнява, когато импортирате файла като модул.

Разбиране на поведението на променливата __name__

The __име__ променлива е вградена в Python. Той представлява името на модула или скрипта, в който се използва. Когато даден скрипт се изпълнява като основна програма, неговата стойност е зададена на __основен__. Ако импортирате скрипта като модул, стойността на променливата е зададена на действителното име на модула.

Първоначално това може да е объркващо, но вижте следния пример:

Създайте скрипт и го наименувайте поздрави.py. Този скрипт ще съдържа функция, която поздравява потребител и отпечатва стойността на __име__ променлива. Той също така ще поиска от потребителя да въведе своето име.

дефпоздравявам(име):
печат (f"Здравей, {име}!")

печат („Стойност на __name__:“, __име__)

ако __име__ == "__основен__":
потребителско_име = вход("Моля въведете вашето име: ")
поздрави (потребителско_име)
друго:
печат („Модулът „поздрави“ е импортиран.“)

Изпълнение на поздрави.py скриптът ще покаже следния резултат:

Стойността на __име__ променливата се връща като __основен__ тъй като скриптът се изпълнява директно.

Сега създайте друг скрипт и го наименувайте script2.py. След това импортирайте поздравления скрипт като модул.

импортиране поздравления

печат („Изпълнявам скрипта за поздрави...“)
поздрави.greet("Алиса")

Обаждане на поздравявам функция от поздрав модул дава следния резултат.

Стойността на __име__ променлива променя действителното име на импортирания модул. В такъв случай, поздравления.

Тази стойност е идиомата if __name__ == "__main__" търси, за да определи дали даден файл се изпълнява като скрипт или е импортиран като модул.

Кога да използваме конструкцията if __name__ == "__main__"?

Можете да добавите if __name__ == "__main__" конструкция във всеки скрипт. Но има някои сценарии, при които използването му може да бъде най-полезно. Ще научите за тези сценарии с помощта на простата калкулаторна програма по-долу.

# calculator.py

дефдобавете(а, б):
връщане a + b

дефизваждам(а, б):
връщане а - б

дефумножават се(а, б):
връщане a * b

дефразделям(а, б):
ако b != 0:
връщане а/б
друго:
връщане„Грешка: Деление на нула!“

ако __име__ == "__основен__":
печат („Добре дошли в калкулатора!“)
печат („Изберете операция:“)
печат ("1. добавете")
печат ("2. изваждане")
печат ("3. умножете")
печат ("4. Разделям")

избор = int (вход("Въведете своя избор (1-4): "))

num1 = float (вход("Въведете първото число: "))
num2 = float (вход(„Въведете второто число:“))

ако избор == 1:
резултат = добавяне (num1, num2)
печат (f"Сумата от {num1} и {num2} е: {резултат}")
елиф избор == 2:
резултат = изваждане (num1, num2)
печат (f „Разликата между {num1} и {num2} е: {резултат}")
елиф избор == 3:
резултат = умножение (num1, num2)
печат (f „Продуктът на {num1} и {num2} е: {резултат}")
елиф избор == 4:
резултат = деление (num1, num2)
печат (f „Разделението на {num1} от {num2} е: {резултат}")
друго:
печат („Невалиден избор!“)

Първият сценарий е, когато искате да стартирате скрипт независимо и да извършите конкретни действия. Това позволява на скрипта да функционира като самостоятелна програма. The if __name__ == "__main__" construct позволява на потребителите да взаимодействат с калкулатора чрез интерфейса на командния ред. Това дава възможност на потребителите да използват функционалността на програмата, без да се налага да разбират или променят основния код.

Все още е възможно да стартирате програмата без if __name__ == "__main__" конструирайте и постигнете същия резултат, но вашият код ще загуби модулна организация на кода.

Вторият сценарий е, когато искате вашето код, за да има модулен дизайн. Това позволява на други програми да импортират вашия скрипт като модул и да използват неговите функции, без да задействат ненужни функции.

В случай на програмата за калкулатор, други програми могат да импортират калкулатор модул без задействане на CLI интерфейса и подкани за въвеждане от потребителя. Това гарантира повторно използване на кода и модулен дизайн. Следователно, позволявайки на калкулатора да бъде безпроблемно интегриран в по-големи приложения.

импортиране калкулатор

# Използване на функциите от модула калкулатор
result_add = calculator.add(5, 3)
печат („Резултат от добавянето:“, резултат_добавяне)

резултат_изваждане = калкулатор.изваждане(10, 4)
печат ("Резултат от изваждането:", резултат_изваждане)

Третият сценарий е когато искате тествайте и отстранявайте грешки във вашия скрипт на Python независимо от всички други модули или скриптове, които могат да го импортират. В примера с калкулатора това улеснява фокусирането върху тестването на функционалността на калкулатора без намеса от външен код.

импортиране калкулатор

# Тестване на функциите на калкулатора
ако __име__ == "__основен__":
# Тестово добавяне
резултат = калкулатор.добавяне(5, 3)
печат („Резултат от добавянето:“, резултат)

# Тестово изваждане
резултат = калкулатор.изваждане(8, 4)
печат ("Резултат от изваждането:", резултат)

# Тестово умножение
резултат = calculator.multiply(2, 6)
печат („Резултат от умножението:“, резултат)

Горният код демонстрира как да отстраните грешките в скрипта на калкулатора независимо.

Кога не е необходимо да се използва конструкцията if __name__ == "__main__"?

Както видяхте в сценариите по-горе, използването на if __name__ == "__main__" construct е да разграничи скрипта, който изпълнявате като основна програма, и този, който импортирате като модул. Има обаче случаи, в които използването му е ненужно.

Първият случай е, когато вашият скрипт е прост и няма многократно използвани функции или модули и не възнамерявате да го импортирате. В този случай трябва да пропуснете тази конструкция, тъй като целият скрипт се изпълнява при изпълнение. Това е обичайно за еднократни скриптове, които изпълняват конкретна цел и не са предназначени за повторна употреба или импортиране.

Другият случай е, когато работите в интерактивна Python сесия, напр. когато използвате Jupyter Notebook. В интерактивна сесия въвеждате и изпълнявате код директно в командния ред или в интерактивна обвивка на Python. Като например Python REPL (Read-Eval-Print Loop). Това ви позволява да експериментирате с код и да тествате малки фрагменти, което ви дава незабавни резултати.

В тези интерактивни среди концепцията за скрипт, работещ като основна програма или импортиран като модул, не се прилага. Вие директно изпълнявате кодови фрагменти без необходимост от традиционна входна точка на скрипт.

Как се става магистър по Python?

За да станете майстор във всеки език за програмиране, трябва да разберете как работят основните концепции на функциите или инструментите. Точно както научихте за конструкцията if __name__ == "__main__" в тази статия.

Разбирането на основните концепции ще ви помогне да разберете как точно ще се държи вашата програма, когато ги използвате. Няма бързане, изучаването на концепциите една по една ще ви помогне да се потопите по-дълбоко във всяка една от тях.