-
Notifications
You must be signed in to change notification settings - Fork 0
Create a new inbuilt library .
Durga Sai edited this page Apr 7, 2026
·
2 revisions
Key Points:
-
__all__in submodule__init__.pyis ESSENTIAL - defines public API __libs__in parent__init__.pytracks all submodulespyproject.tomlonly for dependency changes
Quick reference for creating submodules within an existing project.
A submodule should integrate cleanly with your existing project structure:
existing-project/
├── src/
│ └── parent_package/
│ ├── __init__.py
│ ├── submodule/
│ │ ├── __init__.py # ESSENTIAL: Define __all__ here
│ │ ├── core_module1.py
│ │ ├── core_module2.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ └── helper.py
│ └── other_modules.py
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_submodule/
│ │ ├── __init__.py
│ │ ├── test_core_module1.py
│ │ └── test_core_module2.py
│ └── test_other_modules.py
└── (other project files)
Key Principles:
- Integrate seamlessly with parent package structure
- Keep submodule self-contained but accessible
- Use meaningful names that follow Python conventions
- ESSENTIAL: Always define
__all__in submodule__init__.py
Define __all__ to control public API:
"""Submodule description."""
from __future__ import annotations
from .core_module import MainClass, important_function
__all__ = ["MainClass", "important_function"]Track submodules with __libs__ and convert/utils/utils.py : LIBRARIES:
# In parent_package/__init__.py
__libs__: list[str] = ["submodule1", "submodule2"]"""Core functionality."""
from __future__ import annotations
from typing import Any, Optional
class MainClass:
"""Main class."""
def __init__(self, config: Optional[dict] = None):
self.config = config or {}
def process(self, data: Any) -> Any:
"""Process data."""
return processed_data
def important_function(param: str) -> str:
"""Important function."""
return result"""Pytest configuration."""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
import pytest
from parent_package.submodule import MainClass
@pytest.fixture
def sample_config():
return {"key1": "value1"}
@pytest.fixture
def instance(sample_config):
return MainClass(sample_config)"""Tests."""
import pytest
from parent_package.submodule import MainClass, important_function
class TestMainClass:
def test_init(self, sample_config):
instance = MainClass(sample_config)
assert instance.config == sample_config
def test_process(self, instance):
result = instance.process("data")
assert result is not None
def test_function():
result = important_function("test")
assert isinstance(result, str)Create src/parent_package/submodule/README.md:
# Submodule Name
Brief description.
## Usage
```python
from parent_package.submodule import MainClass
instance = MainClass()
result = instance.process("data")
## Integration with Parent Project
### 1. Parent Package Integration
Update parent package's `__init__.py`:
```python
# In parent_package/__init__.py
__libs__: list[str] = ["submodule", "other_submodule"]
from . import submodule
from .submodule import MainClass1, important_function1
__all__ = [
"submodule",
"MainClass1",
"important_function1",
]
Only update if you need new dependencies:
# In parent project's pyproject.toml
[project]
dependencies = [
"existing-dep>=1.0.0",
"new-submodule-dep>=1.0.0", # Add only if needed
]When creating a new Python submodule:
-
src/parent_package/submodule/__init__.py- ESSENTIAL: Define__all__ -
src/parent_package/submodule/core_module.py- Main functionality -
tests/test_submodule/test_core_module.py- Tests
- Define
__all__in submodule__init__.py(controls public API) - Update parent
__init__.pywith__libs__(tracks submodules) - Update LIBRARIES in utils.py (for importing it is essential)
- Add dependencies to parent
pyproject.toml(if needed) - Import submodule in parent
__init__.py
- Keep public API minimal
- Use sub-packages for internals
- Write tests
- Follow parent project standards
This guide provides a complete foundation for creating a professional, maintainable Python submodule that integrates seamlessly with your existing project.