Created
December 4, 2020 20:46
-
-
Save poteznyKrolik/f0ba325240abfd1df465647405b7b0bb to your computer and use it in GitHub Desktop.
ArgBaseCLass
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| Assuming feature.py implements class Feature(ArgBaseClass), then the above invocation of load_subclasses will return { 'feature' : <Feature object> }. The same kwargs (foo = bar) will be passed into the Feature class. | |
| #!/usr/bin/env python3 | |
| import os, pkgutil, importlib, inspect | |
| """ | |
| class ArgBaseClass(): | |
| # Assign all keyword arguments as properties on self, and keep the kwargs for later. | |
| def __init__(self, **kwargs): | |
| self._kwargs = kwargs | |
| for (k, v) in kwargs.items(): | |
| setattr(self, k, v) | |
| ms = inspect.getmembers(self, predicate=inspect.ismethod) | |
| self.methods = dict([(n, m) for (n, m) in ms if not n.startswith('_')]) | |
| # Add the names of the methods to a parser object. | |
| def _parse_arguments(self, parser): | |
| parser.add_argument('method', choices=list(self.methods)) | |
| return parser | |
| # Instantiate one of each of the subclasses of this class. | |
| def load_subclasses(self): | |
| module_dir = os.path.dirname(__file__) | |
| module_name = os.path.basename(os.path.normpath(module_dir)) | |
| parent_class = self.__class__ | |
| modules = {} | |
| # Load all the modules it the package: | |
| for (module_loader, name, ispkg) in pkgutil.iter_modules([module_dir]): | |
| modules[name] = importlib.import_module('.' + name, module_name) | |
| # Instantiate one of each class, passing the keyword arguments. | |
| ret = {} | |
| for cls in parent_class.__subclasses__(): | |
| path = cls.__module__.split('.') | |
| ret[path[-1]] = cls(**self._kwargs) | |
| return ret | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment