Mejores prácticas para estructurar excepciones de módulos en Python3

Supongamos que tengo un proyecto con una estructura de carpetas como esta.

/project
    __init__.py
    main.py
    /__helpers
        __init__.py
        helpers.py
        ...

El módulohelpers.py define alguna excepción y contiene algún método que genera esa excepción.

# /project/__helpers/helpers.py

class HelperException(Exception):
    pass

def some_function_that_raises():
    raise HelperException

Por otro lado mimain.py El módulo define sus propias excepciones y métodos de importación que pueden generar una excepción dehelpers.py.

# /projects/main.py

from project.__helpers.helpers import some_function_that_raises

class MainException(Exception):
    pass

Ahora, no quiero que los usuarios tengan que hacerfrom project.__helpers.helpers import HelperException si quieren atrapar esa excepción. Tendría más sentido poder importar la excepción desde el módulo público que lo está generando.

Pero no puedo solo movermeHelperException amain.py, lo que crearía una importación circular.

¿Cuál sería la mejor manera de permitir a los usuarios importar todas las excepciones demain.py mientras que los criados en/__helpers?

Respuestas a la pregunta(1)

Su respuesta a la pregunta