Let’s say I have the following structure:

my_module/
  __init__.py
  utilities.py

and __init__.py contains

from .utilities import SomeUtilityFunction

Is there a way to prevent or alert developers when they do

from my_module.utilities import SomeUtilityFunction

instead of

from my_module import SomeUtilityFunction

The problem arose when a few modules started using a function that was imported inside a module in which it wasn’t used, while also being available on the module’s __init__.py, so after linting the file and removing the unused import my tests started failing.

any other advice for situations like this?

  • @Chais
    link
    English
    3
    edit-2
    7 months ago

    You could guard it.
    __init__.py:

    _GUARD_SOME_UTILITY_FUNCTION = True
    from .utilities import SomeUtilityFunction
    

    utilities.py:

    def SomeUtilityFunction():
        if not _GUARD_SOME_UTILITY_FUNCTION:
            raise SomeException("Helpful error message")
    

    Take this with a grain of salt, as I’m typing this on my phone and haven’t actually tried it.

    Alternatively there’s the import-guard package on PyPI. No idea if it’s any good, though. Just something a quick search brought up.

    Edit:
    Ok, I tried my suggestion and it doesn’t work.

    • @[email protected]
      link
      fedilink
      2
      edit-2
      7 months ago

      This approach seems quite overkomplex. Instead of having these errors on runtime, stuff like this should sit in linter rules of any kind.

      • @Chais
        link
        27 months ago

        It’s only useful during development there.