Notícias sobre Ubuntu, Debian, Fedora, Linux, Android, Tecnologia, LibreOffice e muito mais!

Python: import e chamada de método dinâmica

Python, conheça mais sobre o import e case de sucesso!

Olá pessoal, a uns tempos atrás eu necessitei fazer um programa onde houvesse um import dinâmico e uma chamada de método utilizando o nome do método como uma string. Felizmente o Python tem suporte a este tipo de procedimento.

Para exemplificar o que precisei fazer, vejamos estes dois arquivos, um deles chamado main.py e outro chamado imported.py:

imported.py:
def test(string):
 print 'Voce escreveu a string ' + string

main.py:
a = __import__('imported')
getattr(a, 'test')('Novo teste')

Com este código é possível importar um módulo Python em tempo de execução, passando seu nome e executar qualquer método do módulo passando o nome do método como string.

Quando invocamos o método __import__ internamente o python executa um comando import comum, igual ao que temos geralmente no inicio dos arquivos. Tendo isto em mente, pode-se entender que o objeto a contém todos os atributos e métodos do arquivo importado pela chamada __import__.

O comando getattr retorna o valor do atributo passado como parâmetro. Como neste caso estamos tentando executar um método deste objeto, seu retorno pode ser interpretado como um ponteiro para função, e assim podemos passar um parâmetro para o retorno da chamada diretamente, assim executando a função.

Podemos reescrever esta mesma chamada de uma forma mais didática:

a = __import__('imported')

metodo = getattr(a, 'test')
metodo('Novo teste')

Estes recursos geralmente são utilizados em situações muito específicas, por exemplo, onde o usuário pode escrever suas próprias funções e estender o software principal. Tais recursos precisam ser utilizados com muita cautela, pois qualquer erro na string do nome do módulo, no nome do método ou nos parâmetros da chamada do método ocasionam uma exceção, quebrando assim a execução.

Espero que tenham gostado, até mais pessoal!

Autor não localizado! Agradecemos a colaboração!
Comentários