Using exec()
is generally regarded as bad practice (http://stackoverflow.com/questions/1933451/why-should-exec-and-eval-be-avoided). Since you are trying to import a module, you can do the same by using the importlib
package.
Python 2: https://docs.python.org/2/library/importlib.html
Python 3: https://docs.python.org/3/library/importlib.html#module-importlib
Using it should clean up the rest of the code as well.
You might also be interested in this discussion for more possibilities regarding imports: http://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python
Edit 1:
So I gave this a shot and came up with this:
import os
import sys
import pkgutil
from importlib import import_module
import inspect
import base
# I don't want to import foo, bar, or whatever other file is in pkg/
all_my_base_classes = {}
pkg_dir = os.path.dirname(__file__)
for (module_loader, name, ispkg) in pkgutil.iter_modules([pkg_dir]):
module = import_module("." + name, __package__)
for name, classObject in inspect.getmembers(module, inspect.isclass):
if name.startswith('_'):
continue
if issubclass(classObject, base._MyBase):
all_my_base_classes[name] = classObject
I'm still not sure if it isn't easier to use the __all__
method mentioned in the SO article, but that might depend on how you are planning to use that all_my_base_classes
variable.