Python Language
Zmienna specjalna __name__
Szukaj…
Wprowadzenie
Zmienna specjalna __name__
służy do sprawdzania, czy plik został zaimportowany jako moduł, czy też do identyfikowania funkcji, klasy, obiektu modułu za pomocą atrybutu __name__
.
Uwagi
Specjalna zmienna Pythona __name__
jest ustawiona na nazwę modułu zawierającego. Na najwyższym poziomie (np. W interaktywnym tłumaczu lub w głównym pliku) jest on ustawiony na '__main__'
. Można tego użyć do uruchomienia bloku instrukcji, jeśli moduł jest uruchamiany bezpośrednio, a nie importowany.
Powiązany specjalny atrybut obj.__name__
znajduje się w klasach, importowanych modułach i funkcjach (w tym metodach) i podaje nazwę obiektu, gdy jest zdefiniowany.
__name__ == '__main__'
Specjalna zmienna __name__
nie jest ustawiona przez użytkownika. Służy głównie do sprawdzania, czy moduł jest uruchamiany samodzielnie, czy też dlatego, że został przeprowadzony import
. Aby uniknąć uruchamiania przez moduł niektórych części kodu podczas importowania, sprawdź, if __name__ == '__main__'
.
Niech moduł_1.py ma tylko jedną linię:
import module2.py
Zobaczmy, co się stanie, w zależności od module2.py
Sytuacja 1
module2.py
print('hello')
Uruchomienie module1.py wydrukuje hello
Uruchomienie module2.py wydrukuje hello
Sytuacja 2
module2.py
if __name__ == '__main__':
print('hello')
Uruchomienie module1.py nic nie wydrukuje
Uruchomienie module2.py wydrukuje hello
function_class_or_module .__ nazwa__
Specjalnym atrybutem __name__
funkcji, klasy lub modułu jest ciąg znaków zawierający jego nazwę.
import os
class C:
pass
def f(x):
x += 2
return x
print(f)
# <function f at 0x029976B0>
print(f.__name__)
# f
print(C)
# <class '__main__.C'>
print(C.__name__)
# C
print(os)
# <module 'os' from '/spam/eggs/'>
print(os.__name__)
# os
Atrybut __name__
nie jest jednak nazwą zmiennej, która odwołuje się do klasy, metody lub funkcji, a raczej nazwą nadaną jej, gdy jest zdefiniowana.
def f():
pass
print(f.__name__)
# f - as expected
g = f
print(g.__name__)
# f - even though the variable is named g, the function is still named f
Można to wykorzystać między innymi do debugowania:
def enter_exit_info(func):
def wrapper(*arg, **kw):
print '-- entering', func.__name__
res = func(*arg, **kw)
print '-- exiting', func.__name__
return res
return wrapper
@enter_exit_info
def f(x):
print 'In:', x
res = x + 2
print 'Out:', res
return res
a = f(2)
# Outputs:
# -- entering f
# In: 2
# Out: 4
# -- exiting f
Użyj do logowania
Podczas konfigurowania wbudowanej funkcji logging
powszechnym wzorcem jest utworzenie programu rejestrującego o nazwie __name__
bieżącego modułu:
logger = logging.getLogger(__name__)
Oznacza to, że w dziennikach pojawi się pełna nazwa modułu, co ułatwi sprawdzenie, skąd pochodzą wiadomości.