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 ifto 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ą.