Se você não deseja criar o seu próprio, existe uma função disponível no pydoc
módulo que faz exatamente isso:
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
A vantagem dessa abordagem sobre as outras listadas aqui é que locate
você encontrará qualquer objeto python no caminho pontilhado fornecido, não apenas um objeto diretamente dentro de um módulo. por exemplo my_package.my_module.MyClass.attr
.
Se você está curioso para saber qual é a receita deles, aqui está a função:
def locate(path, forceload=0):
"""Locate an object by name or dotted path, importing as necessary."""
parts = [part for part in split(path, '.') if part]
module, n = None, 0
while n < len(parts):
nextmodule = safeimport(join(parts[:n+1], '.'), forceload)
if nextmodule: module, n = nextmodule, n + 1
else: break
if module:
object = module
else:
object = __builtin__
for part in parts[n:]:
try:
object = getattr(object, part)
except AttributeError:
return None
return object
Depende da pydoc.safeimport
função. Aqui estão os documentos para isso:
"""Import a module; handle errors; return None if the module isn't found.
If the module *is* found but an exception occurs, it's wrapped in an
ErrorDuringImport exception and reraised. Unlike __import__, if a
package path is specified, the module at the end of the path is returned,
not the package at the beginning. If the optional 'forceload' argument
is 1, we reload the module from disk (unless it's a dynamic extension)."""