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
.