Zasadniczo celem jest zdefiniowanie centralnego punktu wejścia, wtedy i tylko wtedy, gdy skrypt jest uruchamiany bezpośrednio. Ponieważ __name__
będzie zawsze równy '__main__'
, jeśli jest uruchamiany samodzielnie. Umieszczenie rzeczywistej zawartości skryptu w oddzielnej funkcji umożliwia innym skryptom zaimportowanie tej funkcji i uruchomienie jej w dowolnym momencie, tak aby nie była uruchamiana natychmiast po zaimportowaniu skryptu.
Jest to często używane w modułach biblioteki do domyślnego zachowania, gdy potrzebujesz czegoś szybko. Na przykład moduł http.server
oferuje szeroką funkcjonalność do tworzenia własnego serwera HTTP z dowolnymi funkcjami, jakie można wymyślić. Jeśli chcesz szybko posortować statycznie i przesłać pliki statycznie, możesz po prostu użyć domyślnego zachowania modułu po uruchomieniu z wiersza poleceń.
Uruchamianie python3 -m http.server
w wierszu polecenia będzie dokładnie to robić; uruchom moduł http.server
, który sam rozpocznie prosty serwer HTTP w swoim bloku __name__ == '__main__
.
W odpowiedzi na Twój komentarz:
dla zwykłych modułów, które działają jako biblioteki zawierają typy lub funkcje swoich potrzeb aplikacji, nie trzeba funkcję main
lub główny blok. W przypadku skryptów, które są wywoływane bezpośrednio, na przykład skrypt startowy, który faktycznie uruchamia twoją aplikację, będziesz miał jakiś kod, który nie jest enkapsulowany w funkcjach lub klasach, ale działa bezpośrednio. To byłoby coś, można by umieścić główną funkcję, którą następnie wywołujecie osobno. Daje to nieco więcej swobody w zakresie umieszczania tego kodu. Na przykład możesz mieć funkcję main
bezpośrednio na początku pliku, podczas gdy dodatkowe funkcje, które są wywoływane w niej, są zdefiniowane dalej w pliku. A ostatnia część skryptu to main()
. Niekoniecznie musisz umieścić to w warunku if __main__ == '__main__':
, możesz po prostu zadzwonić bezpośrednio. Tak na przykład skrypt może wyglądać następująco:
def main():
# doing something
utilityFunction(...)
otherUtilityFunction(...)
def utilityFunction (...):
...
def otherUtilityFunction (...):
...
main()
Jeśli nie umieścić kod w osobnej funkcji, trzeba zrobić wszystko, przetwarzanie na dole (po twoich definicji funkcji) oraz że może być nieproduktywny, jeśli chcesz szybko zobaczyć, co robisz, gdy skrypt jest bezpośrednio wywoływany.
Teraz, jak już powiedziałem, nie trzeba umieszczać tego w głównym bloku; możesz po prostu zadzwonić bezpośrednio. Jeśli jednak z jakiegoś powodu konieczne jest dołączenie tego pliku, na przykład dlatego, że chcesz go enkapsulować na jakąś inną rzecz, lub jeśli chcesz wywoływać go wielokrotnie z interaktywnej powłoki (IDLE lub coś podobnego), prawdopodobnie nie chcesz uruchomić main()
za każdym razem, gdy tylko importujesz moduł, ale tylko wtedy, gdy chcesz faktycznie wykonać jego funkcję.To tam powinieneś umieścić main()
w stanie; w ten sposób nie zostanie wykonany, chyba że bezpośrednio wykonujesz moduł.
Ogólnie rzecz biorąc, nie jest złym pomysłem, aby zawsze umieszczać wywołanie main()
w takim stanie, ponieważ nigdy nie będzie bolało, ale często stanie się przydatne w pewnym późniejszym momencie.
dlaczego to się zaczyna podbijać ze wszystkimi tymi duplikatami? – none
Ponieważ to pytanie dotyczy bardzo szerokiej gamy książek pod-pytań, nie wyszczególniaj ani nie zadawaj innych pytań, które wskazałeś powyżej. – user836087