ADR-027: Python Annotations

Status

Accepted

Context

Strong typing improves code quality, maintainability, and tooling support. Type annotations help catch errors early and provide better documentation for contributors.

Decision

Python code in this project is strongly typed. Contributors should use type annotations throughout the codebase. For example:

def __init__(
    self,
    *args,
    user_profile: Optional[UserProfile] = None,
    selected: bool = False,
    api_version: Optional[str] = None,
    manifest: Optional[SAMPluginCommon] = None,
    plugin_id: Optional[int] = None,
    plugin_meta: Optional[PluginMeta] = None,
    data: Union[dict[str, Any], str, None] = None,
    name: Union[str, None] = None,
    **kwargs,
):

To the extent that Python requirements are added to this project, any available corresponding stubs/annotation packages should be added in kind to smarter/requirements/in/local.in. Example:

django-stubs==5.2.2                 # Type annotations for Django
djangorestframework-stubs==3.16.0   # type annotations for djangorestframework
mypy_extensions==1.1.0              # Type annotations for Python

Alternatives Considered

  • Not using type annotations.

  • Relying solely on dynamic typing.

Consequences

  • Positive: - Improves code reliability and maintainability. - Enables better static analysis and tooling. - Reduces runtime errors due to type mismatches.

  • Negative: - Requires contributors to be familiar with Python type hints. - May require additional effort to maintain type stubs and annotations.