'Is there a way to shorten the input command for specific classes in my package?

I would like to create a package that has roughly this structure:

package
    contrib
        case1
            src
                __init__.py
                case1.py
                    class case1
                    + other functions
            data

        case2
            src
                __init__.py
                case2.py
                    class case2
                    + other functions
            data

        case3
        ...

The user will get access to caseX by accessing class caseX in the caseX subfolder.

I went with this format to make it simple for others to contribute their own cases. The idea is that a contributors can, one day, add their own cases by creating a new caseY subfolder in the contrib folder.

However, this structure makes the import command for the classes very long. It would be something like this:

from package.contrib.case1.src.case1 import case1

My question is: Is there a way to shorten the import command? Ideally, I would want to import the class caseX' from the classX` subfolder by simply writing this:

from package import case1

Is that possible?



Solution 1:[1]

If anyone is also having these issues, I figured it out using the importlib package. In the directory /package/contrib/ I added the following to __init__.py:

import importlib

# Add one of these for each class I want to directly load using import
case1 = getattr(importlib.import_module("case1.src.case1", package='package'), "case1")

case1.src.case1 is the path to the file case1.py in Python "dot" notation. The last bit (... , "case1")) refers to the class case1 in the file case1.py.

Now I can write this command and get direct access to the class:

from package import case1

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 partypeter