A Smooth Refresher on Python's Modules

This will be the last tutorial in the Python refreshers series. Of course, I cannot conclude this series unless I move you to the next level in programming, that is, working with modules, which are considered fundamental when handling non-trivial programming tasks.

Nontrivial programming tasks most of the time mean long programs with many lines of code. Modules come in handy as they attempt to break such complex programs into manageable chunks and enable code reuse. This way, you will also be able to use the code at any time by importing that module. You can also solve the issue of copying some function many times in different programs by managing it through modules.

Let's go ahead to the meat of the tutorial, and see how we can work with modules in Python.

Modules in Python

When you created Python programs, you used to put them in some source file ending with .py. Modules in Python are simply created that way. That is, they are source files ending with .py, and located in a directory where Python is able to find them (i.e. the current working directory or listed in sys.path). 

Modules normally contain statements that are related to each other. As mentioned above, we can use modules at any time. Using a module means using the code (i.e. variables, functions) stored in that module. The process of bringing up and using such code is called importing.

Creating Modules

Creating a module in Python is very simple. Let's say we wanted to create a module that would print someone's name. Type the following code using your favorite editor, and save it as myname.py. This will be your module name excluding the .py part, which will be assigned to the global variable __name__.

Importing Modules

If you have another Python file where you are interested in using the code in the module defined above, we will import the module using the import keyword, as follows:

The output of this script will be: Hi Abder.

Be sure that Python is able to find the imported file. For instance, put it in the same directory as the Python file where you used import.

As you can see, importing a module enables us to enhance our program by adding new functionality to it from external files (i.e. modules).

But, what is happening here behind the scenes? When you import a module, Python compiles that module and generates a .pyc file, and a program is only recompiled if the .py is newer than the .pyc file.

Let's take another example, but this time with a Python built-in module. Let's choose the math module. In this example, for a number we pass we want to find the ceiling (the smallest integer value greater than or equal to the number), floor (largest integer value less than or equal to the number), and the absolute value of that number. The Python script for this program looks as follows:

If you run this script, the output should look as follows:

So, we were able to apply different operations on our number without writing code for each operation, but rather by reusing already available functions in the math module. That helps a lot, doesn't it?

You might be wondering, should we always use the math.function() notation? Can't we use the function immediately without preceding it with the module name (i.e. math)? Yes, you can do that by using the following syntax for the import:

from math import *

This way, you can call the previous functions (ceil(x), floor(x), and fabs(x)) without the need to precede them with the module name, math

Modules as Scripts

Let's come back to our simple module, myname.py:

Can we treat this module as a standalone (main) script that we can directly run and pass arguments to from the command line? For instance, what will happen if you typed the following in your command line?

python myname.py 'Abder'

Nothing! Try it—you will not get any output. 

In order to be able to run the module as a script, we have to set __name__ = '__main__'. So, the module myname will now look as follows:

If you run this command in your terminal: python myname.py 'Abder', you should get the following output:

Hi Abder

Packages

An important concept that comes hand in hand with modules is that of packages. A package is a collection of modules. In other words, while a module is a file, a package is a directory/folder. It is a way by which we structure the modules by using dotted module names. So if you see an import statement that looks like:

import university.department

This means we have a module called department in the package university.

As we can see, using modules enables us to split a complex program into manageable chunks, making it easier to track any errors in the program, understanding its functionality better, and enabling reusability.

With this, we come to the end of the Python refreshers series. In this series, we have learned the basics and necessary concepts one needs to grasp in order to move further in the Python programming language. We have learned the concepts of lists, dictionaries, and tuples. We have also learned how to make decisions through conditions (link to Python conditions), and repeat through loops (link to Python loops). We have also learned how to work with functions, create classes and instantiate them (i.e. objects), and package our work in modules.

Tags:

Comments

Related Articles