Jika Anda tidak ingin roll sendiri, ada fungsi yang tersedia di pydoc
modul yang melakukan ini:
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
Keuntungan dari pendekatan ini atas yang lain yang tercantum di sini adalah bahwa locate
akan menemukan setiap objek python di jalan putus-putus yang disediakan, bukan hanya obyek langsung dalam sebuah modul. mis my_package.my_module.MyClass.attr
.
Jika Anda ingin tahu apa resep mereka, inilah fungsinya:
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
Itu bergantung pada pydoc.safeimport
fungsi. Inilah dokumen untuk itu:
"""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)."""