Python – specjalna zmienna __name__

Czy podczas importowania modułów Python’owych zastanawiałeś się w jakim celu wykorzystywane jest sprawdzenie:

if __name__ == '__main__':

Jeśli tak to zapraszam do krótkiego artykułu, w którym omówię tą specjalną zmienną.

Podczas uruchamiania skryptu Python’owego inicjalizowane są specjalne zmienne. Jedną z nich jest __name__, która przechowuje nazwę modułu. Nazwa modułu może się różnić od sposobu uruchomienia skryptu. W momencie uruchomienia bezpośrednio skryptu (nie z importu), moduł przyjmuje nazwę __main__. Można to sprawdzić w łatwy sposób:

print('First module name is {}'.format(__name__))
First module name is __main__

Teraz dodajmy sobie nowy pusty plik, w którym  zaimportujemy pierwszy moduł i wywołamy w nim tą samą funkcję:

import Training
print('Second module name is {}'.format(__name__))
First module name is Training
Second module name is __main__

Jak widzicie zmienna __name__ pierwszego modułu przyjęła nazwę pliku (zawsze przyjmuje nazwę pliku bez ścieżki). Natomiast drugi moduł jako, iż był uruchamiany otrzymał nazwę __main__.

Napiszmy kod, który jeszcze lepiej nam to zobrazuje. W pierwszym module napiszmy:

print('Ten tekst o najlepszym blogu CodeCouple.pl wyświetli się zawsze')

if __name__ == '__main__':
    print('Uruchamiamy bezpośrednio')
else:
    print('Uruchamiamy z importu')

Natomiast w drugim pliku:

import Training
print('Second module name is {}'.format(__name__))

W przypadku uruchomienia bezpośrednio modułu pierwszego otrzymamy wynik:

Ten tekst o najlepszym blogu CodeCouple.pl wyświetli się zawsze
Uruchamiamy bezpośrednio

Natomiast gdy uruchomimy drugi moduł, który importuje pierwszy moduł otrzymamy:

Ten tekst o najlepszym blogu CodeCouple.pl wyświetli się zawsze
Uruchamiamy z importu
Second module name is __main__

Sprawdzenie czy __name__ jest równe __main__ ma na celu sprawdzenie czy plik jest uruchamiany bezpośrednio, czy poprzez import. Do czego przyda nam się ta wiedza? Otóż najczęściej wykorzystywana jest do pisania/wywoływania testów. Ponieważ najczęściej importujemy jakieś moduł, wtedy takie sprawdzenie eliminuje nam odpalenie tych testów. Natomiast dla nas jako autorów jest to dobre miejsce, aby uruchomić testy.

  • Political Correct

    W jaki sposób używacie Pythona codziennie w pracy jako Java Developerzy? Czy nauka i kierunek Web Developmentu (Backend) w Pythonie ma jakąś przyszłość? Bardzo lubie Pythona mimo, że ciężko mi się go uczy znając trochę Javy. Bardzo chętnie poznam Waszą opinię. Pozdrawiam

    • CodeCouple.pl

      Witaj, w aktualnej pracy nie korzystam z Pythona. W poprzedniej korzystaliśmy z Jythona. Czyli Pythona uruchamianego na JVM. Jython był warstwą pośrednią, backend corowy Java EE, front Silverlight potem Angular. Czy sprawdzał się jako backend? Moim zdaniem tak, tylko jak wszystko w informatyce “to zależy” w tym przypadku miał sens ponieważ większość logiki to operacje na kolekcjach. Gdybym robił jakiegoś CMS pewnie wykorzystałbym Django.

      • Political Correct

        Dziękuje za odpowiedź. Ogolnie ciężko mi się przestawić na Pythona ale bardzo fajny ten język, robię aplikacje we Flasku i cholera to jest mega fajne i myślę, czy nie skręcić z drogi Javowej 😉 Cóż dokończe kilka projektów i wtedy zdecyduję :). Dziękuje za odpowiedź, powodzenia z blogiem i pracą. Będe tutaj częściej wpadal 🙂