Python type hinting passed parent references without circular import error - lmmx/devnotes GitHub Wiki

An example of passing a reference to a "parent" when creating a new instance of a class session.py without creating a circular import from importing the class of the 'parent' (which of course has to import the 'child' for its code which involves creating it) relies on the typing module's constant TYPE_CHECKING which is True for type checkers like mypy and False for running the Python program normally.

This allows a conditional import (terrible hack, but the best you can get apparently). Also requires from __future__ import annotations if running versions before Python 3.10.

In session.py you have:

import response


class Session:
    def __repr__(self):
        return f"Session"

    def request(self, url: str):
        self.response = response.Response(self, url)

and response.py:

from __future__ import annotations
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    import session


class Response:
    def __init__(self, session: session.Session, url: str):
        self.parent_session = session