Если вы не хотите бросать свои собственные, в pydoc
модуле доступна функция, которая делает именно это:
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
Преимущество этого подхода перед другими, перечисленными здесь, состоит в том, что locate
он найдет любой объект python по указанному пунктирному пути, а не просто объект непосредственно в модуле. например my_package.my_module.MyClass.attr
.
Если вам интересно, каков их рецепт, вот функция:
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
Это зависит от pydoc.safeimport
функции. Вот документы для этого:
"""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)."""