In Python, __init__.py
is a special file used to indicate that a directory should be treated as a package. It is an essential part of organizing and structuring Python projects.
1. What is __init__.py
?
Defines a directory as a Python package
Can contain initialization code for a package
Allows importing modules from the package
Before Python 3.3, __init__.py
was mandatory for a directory to be considered a package. In modern Python versions, it’s optional, but still useful for package initialization and control.
2. Creating a Package with __init__.py
2.1 Package Structure Example
my_package/
│── __init__.py
│── module1.py
│── module2.py
2.2 Initializing the Package (__init__.py
)
# my_package/__init__.py
print("Initializing my_package")
# Import selected functions for easier access
from .module1 import greet
from .module2 import farewell
2.3 Module Example (module1.py
)
# my_package/module1.py
def greet():
return "Hello from module1!"
2.4 Module Example (module2.py
)
# my_package/module2.py
def farewell():
return "Goodbye from module2!"
2.5 Importing the Package
import my_package
print(my_package.greet()) # Output: Hello from module1!
print(my_package.farewell()) # Output: Goodbye from module2!
3. Use Cases of __init__.py
3.1 Running Initialization Code
You can run setup tasks like logging, setting environment variables, or database connections inside __init__.py
:
# my_package/__init__.py
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("Package initialized!")
3.2 Organizing Sub-Packages
You can structure a package into sub-packages with their own __init__.py
files.
my_package/
│── __init__.py
│── sub_package/
│ │── __init__.py
│ │── submodule.py
Importing from Sub-Packages
from my_package.sub_package import submodule
3.3 Controlling What Gets Imported (__all__
)
The __all__
variable restricts what gets imported when using from my_package import *
:
# my_package/__init__.py
__all__ = ["module1"] # Only module1 is accessible
4. Summary
Feature | Purpose |
---|---|
__init__.py | Marks a directory as a package |
Initialization Code | Runs setup tasks (logging, configuration) |
Selective Imports | Controls accessible functions and modules |
Sub-packages | Supports nested package structures |