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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow