Em python, eu tenho que instanciar certa classe, sabendo seu nome em uma string, mas essa classe 'vive' em um módulo importado dinamicamente. Um exemplo a seguir:
script da classe loader:
import sys
class loader:
def __init__(self, module_name, class_name): # both args are strings
try:
__import__(module_name)
modul = sys.modules[module_name]
instance = modul.class_name() # obviously this doesn't works, here is my main problem!
except ImportError:
# manage import error
script de módulo carregado dinamicamente:
class myName:
# etc...
Eu uso esse arranjo para fazer com que qualquer módulo carregado dinamicamente seja usado pela classe loader, seguindo certos comportamentos predefinidos nos módulos carregados por dyn ...
module = __import__(module, fromlist=[name])
só funcionou para mim.obj.__module__
importlib.import_module
carregará o arquivo .py em um pyc, se necessário, e manipulará a classe module.name.pathing.to.get.to.the a classe.__import__
não fará nenhuma dessas coisas, em um ambiente de django (não testado fora disso) #tl; dr
Importe o módulo raiz
importlib.import_module
e carregue a classe por seu nome usando agetattr
função:explicações
Você provavelmente não deseja usar
__import__
para importar dinamicamente um módulo por nome, pois ele não permite importar sub-módulos:Aqui está o que o documento python diz sobre
__import__
:Em vez disso, use o
importlib
módulo padrão para importar dinamicamente um módulo por nome. Comgetattr
você, você pode instanciar uma classe pelo nome:Você também pode escrever:
Este código é válido em python ≥ 2.7 (incluindo python 3).
fonte
mod = __import__("os.path"); mod.join
enquanto o seguinte não:mod = importlib.import_module("os.path"); mod.join
Use
getattr
para obter um atributo de um nome em uma sequência. Em outras palavras, obtenha a instância comofonte
Snippet de copiar e colar:
fonte
Se você deseja que esta frase
from foo.bar import foo2
seja carregada dinamicamente, faça issofonte
Pode-se simplesmente usar a
pydoc.locate
função.fonte
Eu não consegui chegar lá no meu caso de uso a partir dos exemplos acima, mas Ahmad me aproximou mais (obrigado). Para quem estiver lendo isso no futuro, aqui está o código que funcionou para mim.
fonte