Dlaczego warto używać def main ()? [duplikat]

Możliwy duplikat:
co robi if __name__== "__main__"?

Widziałem kilka próbek kodu i samouczków, które używają

def main():
    # my code here

if __name__ == "__main__":
    main()
Ale dlaczego? Czy jest jakiś powód, aby nie definiować swoich funkcji na górze pliku, a następnie po prostu pisać kod pod nim? ie
def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

Zastanawiam się tylko, czy jest jakiś rym do głównej?

Author: Community, 2010-10-28

5 answers

Bez głównego Sentinela kod byłby wykonywany, nawet gdyby skrypt został zaimportowany jako moduł.

 538
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 18:31:24

Wszyscy już na to odpowiedzieli, ale myślę, że mam jeszcze coś do dodania.

Powody, dla których if wywołanie instrukcji main() (w żadnej konkretnej kolejności):

  • Inne języki (jak C i Java) mają funkcję main(), która jest wywoływana podczas wykonywania programu. Używając tego if, możemy sprawić, by Python zachowywał się jak oni, co wydaje się bardziej znajome dla wielu ludzi.

  • Kod będzie czystszy , łatwiejszy do odczytania i lepszy zorganizowane. (tak, Wiem, że to subiektywne)

  • Będzie możliwe import, że kod Pythona jako moduł bez nieprzyjemnych efektów ubocznych.

    • Oznacza to, że możliwe będzie Uruchamianie testów na tym kodzie.

    • Oznacza to, że możemy zaimportować ten kod do interaktywnej powłoki Pythona i przetestować/debugować / uruchomić go.

  • Zmienne wewnątrz def main to lokalne, podczas gdy te zewnętrzne to globalne . To może wprowadzić kilka błędów i nieoczekiwanych zachowań.

Ale nie musisz pisać funkcji i wywoływać jej wewnątrz if.

Sam zwykle zaczynam pisać małe Skrypty bez żadnej funkcji. Jeśli skrypt rośnie wystarczająco duży, lub jeśli czuję umieszczenie całego kodu wewnątrz funkcji przyniesie mi korzyści, wtedy refaktoryzuję kod i robię to. Dzieje się tak również wtedy, gdy piszę bash Skrypty.

Nawet jeśli umieścisz kod wewnątrz głównej funkcji nie musisz pisać dokładnie tak. Zgrabną odmianą może być:

import sys

def main(argv):
    # My code here
    pass

if __name__ == "__main__":
    main(sys.argv)

Oznacza to, że możesz wywoływać main() z innych skryptów (lub interaktywnej powłoki) przekazując własne parametry. Może to być przydatne w testach jednostkowych lub podczas przetwarzania wsadowego. Pamiętaj jednak, że powyższy kod będzie wymagał parsowania argv, więc może lepiej byłoby użyć innego wywołania, które przekazuje parametry już przetworzone.

W aplikacji zorientowanej obiektowo napisałem, kod wyglądał tak:

class MyApplication(something):
    # My code here

if __name__ == "__main__":
    app = MyApplication()
    app.run()

Więc, nie krępuj się napisać kod, który lepiej pasuje do ciebie. :)

 203
Author: Denilson Sá Maia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-10 19:12:15

Jeśli zawartość foo.py

print __name__
if __name__ == '__main__':
    print 'XXXX'

Plik foo.py może być stosowany na dwa sposoby.

  • zaimportowany w innym pliku: import foo

W tym przypadku __name__ jest foo, sekcja kodu nie jest wykonywana i nie drukuje XXXX.

  • wykonane bezpośrednio: python foo.py

Gdy jest wykonywany bezpośrednio, __name__ jest taki sam jak __main__ i kod w tej sekcji jest wykonywany i wypisuje XXXX

One wykorzystania tej funkcjonalności do pisania różnego rodzaju testów jednostkowych w ramach tego samego modułu.

 85
Author: pyfunc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-06 10:30:11

"co robi if __name__==“__main__”:? " już otrzymaliśmy odpowiedź.

Mając main() function pozwala wywołać jego funkcjonalność, jeśli import moduł. Główną (bez Kalambury) zaletą tego (IMHO) jest to, że możesz go przetestować.

 16
Author: Johnsyweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:30

Rozważmy drugi scenariusz. Jeśli zaimportujesz go do innego, instrukcje, jak na "poziomie globalnym", zostaną wykonane.

 7
Author: Noe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 08:56:48