This is an archived version of the course and is no longer updated. Please find the latest version of the course on the main webpage.

Packages

Let’s say you have now created a large collection of useful modules, each in a separate file, all in a single folder. It would be nice to organise them into a coherent set of modules, in a nice hierarchy.

Taking the example from the official documentation, you might want to organise your audio utility library that you just created. Perhaps in a nice hierarchy.

sound/
      formats/
              wavread.py
              wavwrite.py
              ...
      effects/
              echo.py
              surround.py
              ...
      filters/
              equalizer.py
              vocoder.py
              ...

Python allows you to package a collection of modules into a package.

Packages structure Python’s module namespace by using dotted notation. It consists of modules and subpackages.

sound.formats.wavread
sound.formats.wavwrite
sound.effects.echo

To treat directories like sound as packages, you should include an __init__.py file in the directory. It can be an empty file, may contain some initialisation code, or can be used to set the __all__ variable (we’ll discuss this later).

sound/
      __init__.py
      formats/
              __init__.py
              wavread.py
              wavwrite.py
              ...
      effects/
              __init__.py
              echo.py
              surround.py
              ...
      filters/
              __init__.py
              equalizer.py
              vocoder.py
              ...

You can then import your modules.

import sound.effects.echo

Let’s say that you have a function echofilter inside echo.py. So you can use this function as in a normal module, with all the usual different variants to import the module:

import sound.effects.echo
sound.effect.echo.echofilter()

from sound.effects import echo
echo.echofilter()

from sound.effects import echo as e
echoechofilter()

from sound.effects.echo import echofilter
echofilter()

I am lazy. Can I use from sound import *?

No, unless you are willing to do some work beforehand!

You will have to explicitly tell Python what to import when it sees the asterisk *. This is done with an __all__ variable inside the correct __init__.py.

For example, we want to enable from sound.effects import * to import both the echo and surround module.

We will thus modify sound/effects/__init__.py to contain the following line:

__all__ == ["echo", "surround"]

from sound.effects import * should now import echo and surround into the namespace.

But as usual, consider whether this is a good practice!