# Dive Into Python

Python for experienced programmers

Find:

## 1.6. Testing modules

Python modules are objects and have several useful attributes. You can use this to easily test your modules as you write them.

### Example 1.8. The `if` `__name__` trick

    if __name__ == "__main__":

Some quick observations before we get to the good stuff. First, parentheses are not required around the `if` expression. Second, the `if` statement ends with a colon, and is followed by indented code.

Like C, Python uses `==` for comparison and `=` for assignment. Unlike C, Python does not support in-line assignment, so there’s no chance of accidentally assigning the value you thought you were comparing.

So why is this particular `if` statement a trick? Modules are objects, and all modules have a built-in attribute `__name__`. A module’s `__name__` depends on how you’re using the module. If you `import` the module, then `__name__` is the module’s filename, without directory path or file extension. But you can also run the module directly as a standalone program, in which case `__name__` will be a special default value, `__main__`.

### Example 1.9. An imported module’s `__name__`

    >>> import odbchelper
    >>> odbchelper.__name__
    'odbchelper'

Knowing this, you can design a test suite for your module within the module itself by putting it in this `if` statement. When you run the module directly, `__name__` is `__main__`, so the test suite executes. When you import the module, `__name__` is something else, so the test suite is ignored. This makes it easier to develop and debug new modules before integrating them into a larger program.

On MacPython, there is an additional step to make the `if` `__name__` trick work. Pop up the module’s options menu by clicking the black triangle in the upper-right corner of the window, and make sure Run as __main__ is checked.

### Further reading

- Python Reference Manual discusses the low-level details of importing modules.