Si vous ne voulez pas rouler vous-même, il existe une fonction disponible dans le pydoc
module qui fait exactement cela:
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
L'avantage de cette approche par rapport aux autres listées ici est qu'elle locate
trouvera n'importe quel objet Python dans le chemin en pointillé fourni, pas seulement un objet directement dans un module. par exemple my_package.my_module.MyClass.attr
.
Si vous êtes curieux de savoir quelle est leur recette, voici la fonction:
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
Il repose sur la pydoc.safeimport
fonction. Voici la documentation pour cela:
"""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)."""