Skip to content
Advertisement

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'>

Advertisement

Answer

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.

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement