Специальная переменная __name__

__name__ == '__main__'

Специальная переменная __name__ не устанавливается пользователем. Он в основном используется , чтобы проверить , является ли модуль в настоящее время работают самостоятельно или работать , потому что import был выполнен. Чтобы избежать вашего модуля для выполнения определенной части своего кода , когда он импортируется, проверьте , if __name__ == '__main__' .

Пусть module_1.py быть только одна строка длиной:

import module2.py

И давайте посмотрим , что происходит, в зависимости от module2.py  Ситуация 1

module2.py

print('hello')

Запуск module1.py напечатает hello \ Запуск module2.py напечатает hello  Ситуация 2

module2.py

if __name__ == '__main__':
    print('hello')

Запуск module1.py не будет печатать ничего \ Запуск module2.py напечатает hello

function_class_or_module .__ name__

Специальный атрибут __name__ из функции, класса или модуля является строка , содержащая его имя.

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

__name__ атрибут, однако, не имя переменной , которая ссылается на класс, метод или функцию, а это имя , данное ему при определен.

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

Это может быть использовано, среди прочего, для отладки:

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 

Использовать в журнале

При настройке встроенного logging функциональности, общая картина , чтобы создать регистратор с __name__ текущего модуля:

logger = logging.getLogger(__name__)

Это означает, что полное имя модуля будет отображаться в журналах, что упрощает просмотр источника сообщений.