I was working on a bit of code today where I wanted to be able to dynamically load a class from a module that’s specified by some external configuration.
Let’s say you have a package called widgets and within that, a series of
modules (e.g. mail, sms, irc etc.) that contain classes which all inherit
from the superclass WidgetAPI.
To load the widgets.mail.WidgetAPI class when given the string 'mail' by
the user, you could do:
import inspect
import importlib
from widgets import WidgetAPI
def find_widget(widget_type):
try:
module = importlib.import_module('widgets.{0}'.format(widget_type))
for x in dir(module):
obj = getattr(module, x)
if inspect.isclass(obj) and issubclass(obj, WidgetAPI) and obj is not WidgetAPI:
return obj
except ImportError:
return None
if __name__ == '__main__':
print(find_widget('mail'))
print(find_widget('blah'))This will produce the output:
<class 'widgets.mail.MailWidget'>
None