Wenn Sie nicht selbst rollen möchten, steht im pydoc
Modul eine Funktion zur Verfügung , die genau dies ausführt:
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
Der Vorteil dieses Ansatzes gegenüber den anderen hier aufgeführten ist , dass locate
finden alle an dem vorgesehenen gepunkteten Pfad Python - Objekt, nicht nur ein Objekt direkt innerhalb eines Moduls. zB my_package.my_module.MyClass.attr
.
Wenn Sie neugierig sind, was ihr Rezept ist, ist hier die Funktion:
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
Es hängt von der pydoc.safeimport
Funktion ab. Hier sind die Dokumente dafür:
"""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)."""