
Python
Solve complex import scenarios in deeply nested packages and multi-level hierarchies.
Navigate complex multi-level package structures.
company/
āāā __init__.py
āāā core/
ā āāā __init__.py
ā āāā models.py
āāā services/
ā āāā __init__.py
ā āāā user/
ā ā āāā __init__.py
ā ā āāā models.py
ā ā āāā handlers.py
ā āāā order/
ā āāā __init__.py
ā āāā models.py
ā āāā handlers.py
āāā utils/
āāā __init__.py
āāā validators.pyIn company/services/user/handlers.py:
# Import from sibling module (same level)
from .models import User
# Import from parent package's sibling
from ..order.models import Order
# Import from grandparent package's child
from ...core.models import BaseModel
# Import from utils (multiple levels up)
from ...utils.validators import validate_email
class UserHandler:
def handle_user_order(self, user: User, order: Order):
"""Handler combining models from different packages."""
if not validate_email(user.email):
raise ValueError("Invalid email")
return {"user": user, "order": order}Solve circular imports across multiple levels.
# Problem: circular import across levels
# company/services/user/models.py
from ...core.models import BaseModel
from .handlers import UserHandler # Circular if handlers imports this
# company/services/user/handlers.py
from .models import User # Circular!Solution 1: Structural reorganization:
# Separate models and handlers
company/
āāā models/
ā āāā __init__.py
ā āāā user.py
ā āāā order.py
āāā handlers/
āāā __init__.py
āāā user.py
āāā order.py# company/models/user.py
from ...core.models import BaseModel
class User(BaseModel):
pass
# company/handlers/user.py (no circular dependency)
from ..models.user import User
class UserHandler:
passSolution 2: TYPE_CHECKING imports:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .handlers import UserHandler
class User:
def render(self) -> "UserHandler":
# Only imports at type-check time, not runtime
from .handlers import UserHandler
return UserHandler().render(self)Design __init__.py for complex hierarchies.
# company/__init__.py - Root package initialization
from . import core
from . import services
from . import utils
__version__ = "1.0.0"
__all__ = ["core", "services", "utils"]
# company/services/__init__.py - Services subpackage
from . import user
from . import order
__all__ = ["user", "order"]
# company/services/user/__init__.py - User service package
from .models import User, UserProfile
from .handlers import UserHandler
__all__ = ["User", "UserProfile", "UserHandler"]
# Now users can do:
from company.services.user import User
from company.services import orderHandle different relative import scenarios.
# company/services/user/models.py
# ā
Valid: Same package, same level
from . import handlers
# ā
Valid: Sibling subpackage
from ..order import models as order_models
# ā
Valid: Parent package
from .. import validators
# ā
Valid: Grandparent
from ... import core
# ā
Valid: Grandparent's child
from ...core.models import BaseModel
# ā Invalid: Can't go above top level
from .... import something # Would try to go above company
# ā Invalid: Can't use relative with absolute in same statement
from ..order import Order
import external_package # Fine separately, but mixing is confusingOrganize multiple interdependent packages.
project/
āāā package_a/
ā āāā __init__.py
ā āāā module_a.py
ā āāā subpkg/
ā āāā __init__.py
ā āāā module_a_sub.py
āāā package_b/
āāā __init__.py
āāā module_b.py
āāā subpkg/
āāā __init__.py
āāā module_b_sub.pyIn package_b/module_b.py:
# Can import from package_a (different top-level package)
# But only with absolute imports (no relative imports across packages)
import package_a
from package_a.module_a import ClassA
# Within package_b, use relative imports
from . import subpkg
from .subpkg.module_b_sub import ClassBSubUse relative imports to aggregate and expose package APIs.
# company/services/__init__.py - Aggregate service APIs
# Import all public items from subpackages
from .user import User, UserHandler
from .user import UserService
from .order import Order, OrderHandler
from .order import OrderService
# Re-export as package API
__all__ = [
"User",
"UserHandler",
"UserService",
"Order",
"OrderHandler",
"OrderService"
]
# Users can now do:
from company.services import User, Order
# Instead of:
# from company.services.user import User
# from company.services.order import OrderLazy re-export:
# company/services/__init__.py - Lazy export
def __getattr__(name):
"""Lazy import for performance."""
if name == "User":
from .user import User
return User
elif name == "Order":
from .order import Order
return Order
raise AttributeError(f"module {__name__} has no attribute {name}")
def __dir__():
return ["User", "Order"]Best practices template:
myproject/
āāā setup.py
āāā setup.cfg
āāā src/
āāā myproject/ # Top-level package
āāā __init__.py # Version, exports
āāā core/ # Core functionality
ā āāā __init__.py
ā āāā models.py
ā āāā utils.py
āāā services/ # Business logic
ā āāā __init__.py
ā āāā user/
ā ā āāā __init__.py
ā ā āāā models.py
ā ā āāā handlers.py
ā āāā order/
ā āāā __init__.py
ā āāā models.py
ā āāā handlers.py
āāā api/ # API layer
āāā __init__.py
āāā v1/
ā āāā __init__.py
ā āāā users.py
ā āāā orders.py
āāā v2/
āāā __init__.py
āāā users.py
āāā orders.pymyproject/__init__.py:
__version__ = "1.0.0"
from . import core
from . import services
from . import api
__all__ = ["core", "services", "api"]myproject/services/__init__.py:
# Use relative imports
from . import user
from . import order
__all__ = ["user", "order"]myproject/services/user/__init__.py:
from .models import User
from .handlers import UserHandler
__all__ = ["User", "UserHandler"]When to use relative imports:
# ā
Within same package/subpackage
from .models import User
# ā
Accessing parent package siblings
from ..order import Order
# ā
Accessing utilities from parent
from ...utils import validatorsWhen to use absolute imports:
# ā
Different top-level packages
from package_a import something
# ā
External libraries
import numpy as np
# ā
From installed packages
from requests import getReady to practice? Challenges | Quiz
Resources
Ojasa Mirai
Master AI-powered development skills through structured learning, real projects, and verified credentials. Whether you're upskilling your team or launching your career, we deliver the skills companies actually need.
Learn Deep ⢠Build Real ⢠Verify Skills ⢠Launch Forward