User Tools

Site Tools


python:python_misc:python_modules_name_and_main

Python modules, __name__ and "__main__"

Mithat Konar
Oct 21, 2022

What's a module?

A module in Python is a file of Python code that is imported into another Python file. Importing modules gives you access to their contents in the file that imports them.

A very popular module is the math module. The most common way to import the code in the math module is to use the simplest form of the import statement:

import math

When you do this, you can use things that are made available to you in the module by prepending the name of the module and the dot operator in front of the identifier of the thing you want to use in the module:

ang = deg * math.pi/180
val = math.sin(ang)

Writing your own modules

Any Python file you write can be imported into another Python file as a module. For example, let’s assume we have the file my_functions.py that contains some functions we use a lot:

my_functions.py
'''
file: my_functions.py
Some functions that I use a lot.
Mithat Konar
'''
 
def triangle_area(base, height):
    '''
    Return the area of a triangle of known base and height.
    Parameters:
        base: the base of the triangle
        height: the height of the triangle
    Precondition: base and height are numeric arguments.
    '''
    area = base * height / 2
    return area
 
def rectangle_area(width, height):
    '''
    Return the area of a rectangle of known width and height.
    Parameters:
        width: the width of the rectangle
        height: the height of the rectangle
    Precondition: width and height are numeric arguments.
    '''
    area = width * height
    return area

This can be imported into the file my_program.py, which can then these use the functions defined in my_functions.py:

my_program.py
'''
file: my_program.py
Interactive program that asks user to compute the area of a rectangle.
Mithat Konar
'''
 
import my_functions
 
# Function definition(s)
def say_hello():
    '''Welcome the user to the program.'''
    greeting = 'This program will compute the area of a rectangle.'
    print(greeting)
 
# "__main__"
say_hello()
 
# get data from the user
w = float(input('Enter the width of a rectangle: '))
h = float(input('Enter the height of a rectangle: '))
 
# compute results
area = my_functions.rectangle_area(w, h)
 
# output results
print(f'The area of a {w} by {h} rectangle is {area}.')

Notice that to import the file my_functions.py, we used the name of the file without the .py extension:

import my_functions

Notice also that we prepended the name of the module and the dot operator to the name of the function we wanted to access:

area = my_functions.rectangle_area(w, h)

Where do you put the files you want to import?

There are a few places Python will look for files to import. The easiest place to put them for now is in the same directory (i.e., folder) as the file that will be importing them.

What’s in a __name__?

Every Python file that’s used in a program has a __name__ variable associated with it. When a file is imported as a module, the file’s __name__ variable is automatically set to a string containing the name of the module. So, in the example above, the __name__ variable of the my_functions module while when it's imported into our program is 'my_functions'.

However, when the file is not imported as a module, which is to say when a file is run as a program, its __name__ variable is instead set to the somewhat cryptic string '__main__'. This is done so that at runtime we can determine whether a file is being imported as a module or is being run as a program. If a file is being run as a program, the condition:

__name__ == '__main__'

will be True. If the file is being imported as module, it will be False.

Leveraging the __name__ variable

Because you are able to tell at runtime whether a file is being imported as a module or being run as a program, you can include additional code in the file you plan to use as a module that you only want to execute when run as a program. A common use for this is to include code that tests just the code in the module. In other words, you can use this feature to develop your module as a standalone program that includes code that tests the functions you are developing. But when you import the file as a module, those tests will not run. Adding some testing code to our my_functions.py file would like:

my_functions.py
'''
file: my_functions.py
Some functions that I use a lot.
Mithat Konar
'''
 
def triangle_area(base, height):
    '''
    Return the area of a triangle of known base and height.
    Parameters:
        base: the base of the triangle
        height: the height of the triangle
    Precondition: base and height are numeric arguments.
    '''
    area = base * height / 2
    return area
 
def rectangle_area(width, height):
    '''
    Return the area of a rectangle of known width and height.
    Parameters:
        width: the width of the rectangle
        height: the height of the rectangle
    Precondition: width and height are numeric arguments.
    '''
    area = width * height
    return area
 
if __name__ == '__main__':
    # test my functions
    print('Testing triangle_area:')
    b = 1
    h = 1
    area = triangle_area(b, h)
    print(area)
 
    b = 3.3
    h = 2.2
    area = triangle_area(b, h)
    print(area)
 
    print('Testing rectangle_area:')
    h = 1
    w = 1
    area = rectangle_area(h, w)
    print(area)
 
    h = 3.3
    w = 2.2
    area = rectangle_area(h, w)
    print(area)

Notice the line:

if __name__ == '__main__':

This essentially says, “If this file is being run as a program, execute the code below. Otherwise, don’t.” So, this means when we import the file into my_program.py, the testing code we added to my_functions.py won’t run.

Checking all your files

It’s a common practice that verges on being a best practice to add the

if __name__ == '__main__':

test to all Python files, even those you don’t plan to use as modules.

So, for completeness, here is our original my_program.py file with the added test in the expected place:

my_program.py
'''
file: my_program.py
Interactive program that asks user to compute the area of a rectangle.
Mithat Konar
'''
 
import my_functions
 
# Function definitions
def say_hello():
    '''Welcome the user to the program.'''
    greeting = 'This program will compute the area of a rectangle.'
    print(greeting)
 
# "__main__"
if __name__ == '__main__':
    say_hello()
 
    # get data from the user
    w = float(input('Enter the width of a rectangle: '))
    h = float(input('Enter the height of a rectangle: '))
 
    # compute results
    area = my_functions.rectangle_area(w, h)
 
    # output results
    print(f'The area of a {w} by {h} rectangle is {area}.')
python/python_misc/python_modules_name_and_main.txt · Last modified: 2022/10/22 01:52 by mithat

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki