Importing classes from different files in a subdirectory

前端 未结 5 1304
深忆病人
深忆病人 2020-11-29 07:21

Here\'s the structure I\'m working with:

directory/
          script.py
          subdir/
                 __init__.py
                 myclass01.py
                 


        
5条回答
  •  盖世英雄少女心
    2020-11-29 07:50

    I know it's been a couple months since this question was answered, but I was looking for the same thing and ran across this page. I wasn't very satisfied with the chosen answer, so I ended up writing my own solution and thought I'd share it. Here's what I came up with:

    # NOTE: The function name starts with an underscore so it doesn't get deleted by iself
    def _load_modules(attr_filter=None):
        import os
    
        curdir = os.path.dirname(__file__)
        imports = [os.path.splitext(fname)[0] for fname in os.listdir(curdir) if fname.endswith(".py")]
    
        pubattrs = {}
        for mod_name in imports:
            mod = __import__(mod_name, globals(), locals(), ['*'], -1)
    
            for attr in mod.__dict__:
                if not attr.startswith('_') and (not attr_filter or attr_filter(mod_name, attr)):
                    pubattrs[attr] = getattr(mod, attr)
    
        # Restore the global namespace to it's initial state
        for var in globals().copy():
            if not var.startswith('_'):
                del globals()[var]
    
        # Update the global namespace with the specific items we want
        globals().update(pubattrs)
    
    # EXAMPLE: Only load classes that end with "Resource"
    _load_modules(attr_filter=lambda mod, attr: True if attr.endswith("Resource") else False)
    del _load_modules # Keep the namespace clean
    

    This simply imports * from all .py files in the package directory and then only pulls the public ones into the global namespace. Additionally, it allows a filter if only certain public attributes are desired.

提交回复
热议问题