Are `__init__.py` Files Required in Every Subfolder?
Short Answer:
No, but it depends on:
- Python version being used
- Package structure requirements
- Specific functionality needed
Detailed Breakdown:
1. Python Version Considerations
- Python < 3.3: Required in every directory to be recognized as a package
- Python 3.3+: Not strictly required (namespace packages) but still commonly used
2. When They're Not Required:
- Namespace Packages (Python 3.3+)
- Directories containing only data/configuration files
- Subfolders not meant to be imported directly
- When using implicit namespace packages
3. When They're Required:
- Traditional (Regular) Packages (even in Python 3.3+)
- When using relative imports between modules
- To define
__all__
for public API - When initializing package-level state
Example Scenarios:
1. Traditional Package Structure (requires __init__.py
)
my_package/
__init__.py
utils/
__init__.py
helpers.py
models/
__init__.py
base.py
2. Namespace Package Structure (no __init__.py
)
my_package/
core/
calculations.py # No __init__.py needed
web/
routing.py # No __init__.py needed
Key Exceptions:
- Required if you need to:
- Import from sibling modules (
from ..utils import helpers
) - Maintain backward compatibility with older Python versions
- Use package initialization hooks
- Control module exposure with
__all__
- Import from sibling modules (
Best Practice Recommendations:
-
Include
__init__.py
in subfolders if:- You need to import between submodules
- You want explicit package declaration
- Working with legacy codebases
-
Omit
__init__.py
if:- Creating namespace packages (Python 3.3+)
- Directories are just organizational containers
- You want to avoid package initialization overhead
-
Hybrid Approach:
# my_package/__init__.py
__path__ = __import__('pkgutil').extend_path(__path__, __name__)