Przed wyjaśnieniem czegokolwiek na temat if __name__ == '__main__'
ważne jest, aby zrozumieć, co __name__
jest i co robi.
Co to jest __name__
?
__name__
jest DunderAlias - można go traktować jako zmienną globalną (dostępną z modułów) i działa w podobny sposób global
.
Jest to ciąg (globalny, jak wspomniano powyżej), jak wskazano przez type(__name__)
(ustępowanie <class 'str'>
), i jest wbudowanym standardem zarówno dla wersji Python 3, jak i Python 2 .
Gdzie:
Można go używać nie tylko w skryptach, ale można go również znaleźć zarówno w interpreterie, jak i modułach / pakietach.
Interpretator:
>>> print(__name__)
__main__
>>>
Scenariusz:
test_file.py :
print(__name__)
Wynikające z __main__
Moduł lub pakiet:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
Wynikające z somefile
Zauważ, że gdy jest używany w pakiecie lub module, __name__
przyjmuje nazwę pliku. Ścieżka rzeczywistej ścieżki modułu lub pakietu nie jest podana, ale ma własną DunderAlias__file__
, która pozwala na to.
Powinieneś zobaczyć, że gdzie __name__
, gdzie jest to główny plik (lub program), zawsze będzie zwracany __main__
, a jeśli jest to moduł / pakiet lub cokolwiek, co działa z innym skryptem Pythona, zwróci nazwę pliku, w którym jest pochodzi z.
Ćwiczyć:
Bycie zmienną oznacza, że jej wartość może zostać nadpisana („może” nie oznacza „powinna”), nadpisanie wartości __name__
spowoduje brak czytelności. Więc nie rób tego z jakiegokolwiek powodu. Jeśli potrzebujesz zmiennej, zdefiniuj nową zmienną.
Zawsze przyjmuje się, że wartość __name__
to __main__
lub nazwa pliku. Ponowna zmiana tej wartości domyślnej spowoduje więcej zamieszania, że zrobi to dobrze, powodując problemy w dalszej linii.
przykład:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
Ogólnie uważa się za dobrą praktykę włączanie if __name__ == '__main__'
skryptów.
Teraz, aby odpowiedzieć if __name__ == '__main__'
:
Teraz wiemy, że zachowanie się __name__
rzeczy staje się wyraźniejsze:
Jest if
to instrukcja kontroli przepływu, która zawiera blok kodu, zostanie wykonana, jeśli podana wartość jest prawdą. Widzieliśmy, że __name__
może to zająć albo
__main__
nazwę pliku, z którego został zaimportowany.
Oznacza to, że jeśli __name__
jest równe, __main__
to plik musi być plikiem głównym i musi faktycznie działać (lub jest to interpreter), a nie moduł lub pakiet zaimportowany do skryptu.
Jeśli rzeczywiście __name__
przyjmie wartość, __main__
to wszystko, co jest w tym bloku kodu, zostanie wykonane.
To mówi nam, że jeśli uruchomiony plik jest plikiem głównym (lub bezpośrednio z interpretera), to warunek ten musi zostać spełniony. Jeśli jest to pakiet, nie powinien, a wartość nie będzie __main__
.
Moduły:
__name__
może być również użyty w modułach do zdefiniowania nazwy modułu
Warianty:
Można także robić inne, mniej powszechne, ale przydatne rzeczy __name__
, niektóre pokażę tutaj:
Wykonywanie tylko, jeśli plik jest modułem lub pakietem:
if __name__ != '__main__':
# Do some useful things
Uruchamianie jednego warunku, jeśli plik jest głównym, a drugiego, jeśli nie jest:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
Można go również użyć do zapewnienia uruchomionych funkcji pomocy / programów narzędziowych na pakietach i modułach bez skomplikowanego korzystania z bibliotek.
Umożliwia także uruchamianie modułów z wiersza poleceń jako głównych skryptów, co może być również bardzo przydatne.
if __name__ == "__main__":
warunek blokowania jest przestarzały / nieaktualny aż do Pythona 3? Znalazłem informacje, które to potwierdzają.