Dlaczego warto używać def main ()? [duplikat]
Możliwy duplikat:
co robiif __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?
5 answers
Bez głównego Sentinela kod byłby wykonywany, nawet gdyby skrypt został zaimportowany jako moduł.
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 tegoif
, 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. :)
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.
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ć.
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.
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