Dada uma string de uma classe Python, por exemplo my_package.my_module.MyClass
, qual é a melhor maneira possível de carregá-la?
Em outras palavras, estou procurando um equivalente Class.forName()
em Java, função em Python. Ele precisa funcionar no Google App Engine.
De preferência, essa seria uma função que aceita o FQN da classe como uma sequência e retorna uma referência à classe:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
python
reflection
python-import
pjesi
fonte
fonte
Respostas:
Na documentação do python, aqui está a função que você deseja:
A razão pela qual um simples
__import__
não funciona é porque qualquer importação de algo além do primeiro ponto em uma cadeia de pacotes é um atributo do módulo que você está importando. Assim, algo assim não funcionará:Você teria que chamar a função acima da seguinte maneira:
Ou no caso do seu exemplo:
Edição : Eu estava um pouco fora sobre isso. O que você basicamente quer fazer é o seguinte:
A função acima é necessária apenas se você tiver uma lista em branco vazia . Assim, a chamada apropriada seria assim:
fonte
Se você não deseja criar o seu próprio, existe uma função disponível no
pydoc
módulo que faz exatamente isso:A vantagem dessa abordagem sobre as outras listadas aqui é que
locate
você encontrará qualquer objeto python no caminho pontilhado fornecido, não apenas um objeto diretamente dentro de um módulo. por exemplomy_package.my_module.MyClass.attr
.Se você está curioso para saber qual é a receita deles, aqui está a função:
Depende da
pydoc.safeimport
função. Aqui estão os documentos para isso:fonte
qualname
(objeto que não está no topo do espaço para nome do módulo) corretamente também.locate('my_package.my_module.MyClass.attr.method.etc')
fonte
fonte
(modulename, classname) = cl.rsplit('.', 2)
rsplit('.', 1)
?Se você estiver usando o Django, você pode usar isso. Sim, eu sei que o OP não pediu django, mas eu me deparei com essa pergunta procurando uma solução Django, não encontrei uma e a coloquei aqui para o próximo garoto / garota que a procura.
Lembre-se de que se deseja importar algo que não possui
.
, gostare
ouargparse
usa:fonte
Aqui está para compartilhar algo que eu encontrei
__import__
eimportlib
enquanto tentava resolver esse problema.Estou usando o Python 3.7.3.
Quando tento chegar à aula
d
no móduloa.b.c
,A
mod
variável refere-se ao espaço para nome superiora
.Então, para chegar à aula
d
, eu precisoSe tentarmos fazer
na verdade, estamos tentando procurar
a.d
.Ao usar
importlib
, suponho que a biblioteca tenha sido recursivagetattr
por nós. Então, quando usamosimportlib.import_module
, realmente identificamos o módulo mais profundo.fonte
OK, para mim, é assim que funciona (estou usando o Python 2.7):
Então, b é uma instância da classe 'MyClass'
fonte
Se você já possui uma instância da sua classe desejada, pode usar a função 'type' para extrair seu tipo de classe e usá-la para construir uma nova instância:
fonte
fonte
No Google App Engine, há uma
webapp2
função chamadaimport_string
. Para mais informações, consulte aqui: https://webapp-improved.appspot.com/api/webapp2.htmlAssim,
Por exemplo, isso é usado no
webapp2.Route
local em que você pode usar um manipulador ou uma string.fonte