Tuesday, April 2, 2013

Python Packages

In this part of the Python programming tutorial, we will talk about packages.
A package is a collection of modules which have a common purpose. Technically a package is a directory which must have one special file called __init__.py.
There are several ways to manage Python code:
  • functions
  • classes
  • modules
  • packages
When we deal with large projects containing hundreds or thousands of modules, using packages is crucial. For example, we could put all database related modules in a database package, user interface code in ui package etc.
  
read.py
constants/
__init__.py
names.py
In our current working directory we have a constants directory and a read.py script.
The constants directory has two files. __init__.py file makes constants a Python package. The names.py is an ordinary module.
from names import names

print "initializing constants package"
The __init__.py file is initialized when the package is imported. Here we can control, what object will be available to the module, which imports the package.
#!/usr/bin/python

# names.py

names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
The names.py module has a tuple of 5 names.
#!/usr/bin/python

# read.py

import constants

print constants.names
Finally, the read.py script imports the constants package. We print the names tuple from the package.
$ ./read.py 
initializing constants package
('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')

We can also create subpackages. To access subpackages, we use the dot operator.
read.py
constants/
__init__.py
names.py
numbers/
__init__.py
integers.py
This is the new hierarchy. We have a subpackage called numbers.
from integers import integers
The __init__.py file in the numbers package has this one line.
#!/usr/bin/python

# integers.py


integers = (2, 3, 45, 6, 7, 8, 9)
The integers module defines a tuple of 7 integers. This tuple will be accessed from the read.py script.
#!/usr/bin/python

# read.py

import constants
import constants.numbers as int

print constants.names
print int.integers
The read.py script is modified a bit.
$ ./read.py 
initializing constants package
('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
(2, 3, 45, 6, 7, 8, 9)

from package import * construct in a __init__.py file could cause problems on some older operating systems. Therefore a special variable __all__ has been introduced. This variable controls what objects will be imported from a package.
__all__ = ["names"]

print "initializing constants package"
Here we modify the __init__.py file in the constants directory.
#!/usr/bin/python

# read.py

from constants import names
import constants.numbers as int

print names.names
print int.integers
We also change the read.py script accordingly.
$ ./read.py
initializing constants package
('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
(2, 3, 45, 6, 7, 8, 9)
The output is the same.
In this chapter, we have covered packages in Python.

No comments:

Post a Comment