Search code examples
pythonpython-3.xmodulenamespaces

How to tell if Python module is a namespace module


In Python 3, modules can be namespace modules without an __init__.py (as per PEP 420) or as a regular module (i.e. '[modules] packages as they are implemented in Python 3.2 and earlier' - PEP 420) that have an __init__.py or are a single .py file.

How can you tell the difference between a namespace module and an 'ordinary' module?

(I am using Python 3.5.3)

e.g. Namespace module named mod prints out as:

(Pdb) mod
<module 'mymodule' (namespace)>

and ordinary modules print out as:

(Pdb) mod
<module 'mymodule' from '/path/to/mymodule/__init__.py'>

Solution

  • Namespace packages have a __path__, and either __file__ set to None or no __file__ attribute. (__file__ is set to None on Python 3.7 and later; previously, it was unset.)

    if hasattr(mod, '__path__') and getattr(mod, '__file__', None) is None:
        print("It's a namespace package.")
    

    In contrast, modules that aren't packages don't have a __path__, and packages that aren't namespace packages have __file__ set to the location of their __init__.py.