Python Language

The __name__ special variable

Introduction#

The __name__ special variable is used to check whether a file has been imported as a module or not, and to identify a function, class, module object by their __name__ attribute.

Remarks#

The Python special variable __name__ is set to the name of the containing module. At the top level (such as in the interactive interpreter, or in the main file) it is set to '__main__'. This can be used to run a block of statements if a module is being run directly rather than being imported.

The related special attribute obj.__name__ is found on classes, imported modules and functions (including methods), and gives the name of the object when defined.

name == ’main

The special variable __name__ is not set by the user. It is mostly used to check whether or not the module is being run by itself or run because an import was performed. To avoid your module to run certain parts of its code when it gets imported, check if __name__ == '__main__'.

Let module_1.py be just one line long:

import module2.py

And let’s see what happens, depending on module2.py

Situation 1

module2.py

print('hello')

Running module1.py will print hello
Running module2.py will print hello

Situation 2

module2.py

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

Running module1.py will print nothing
Running module2.py will print hello

function_class_or_module.name

The special attribute __name__ of a function, class or module is a string containing its 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

The __name__ attribute is not, however, the name of the variable which references the class, method or function, rather it is the name given to it when defined.

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

This can be used, among others, for debugging:

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

Use in logging

When configuring the built-in logging functionality, a common pattern is to create a logger with the __name__ of the current module:

logger = logging.getLogger(__name__)

This means that the fully-qualified name of the module will appear in the logs, making it easier to see where messages have come from.


This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow