Qual é a melhor maneira de chamar uma função, dada uma string com o nome da função em um programa Python. Por exemplo, digamos que eu tenho um módulo foo
e uma string cujo conteúdo é "bar"
. Qual é a melhor maneira de ligar foo.bar()
?
Preciso obter o valor de retorno da função, e é por isso que não uso apenas eval
. Eu descobri como fazer isso usando eval
para definir uma função temp que retorna o resultado dessa chamada de função, mas espero que exista uma maneira mais elegante de fazer isso.
foo
globals()
methodToCall = globals()['bar']
ou
locals retorna um dicionário com uma tabela de símbolos local atual. globals retorna um dicionário com tabela de símbolos global.
fonte
A solução de Patrick é provavelmente a mais limpa. Se você também precisar pegar o módulo dinamicamente, poderá importá-lo como:
fonte
importlib.import_module
. Os documentos oficiais dizem sobre__import__
: "Esta é uma função avançada que não é necessária na programação diária do Python, ao contrário do importlib.import_module ()." docs.python.org/2/library/functions.html#__import__importlib.import_module
é suportado em 3.6. Veja docs.python.org/3.6/library/…Apenas uma contribuição simples. Se a classe que precisamos instanciar estiver no mesmo arquivo, podemos usar algo como isto:
Por exemplo:
E, se não uma classe:
fonte
Dada uma string, com um caminho python completo para uma função, foi assim que obtive o resultado dessa função:
fonte
__import__
função.A melhor resposta de acordo com as perguntas frequentes sobre programação em Python seria:
fonte
A resposta (espero) que ninguém nunca quis
Eval como comportamento
Por que não adicionar a importação automática
Caso tenhamos dicionários extras, queremos verificar
Precisamos ir mais fundo
fonte
Quanto vale a pena, se você precisar passar o nome da função (ou classe) e o nome do aplicativo como uma sequência, faça o seguinte:
fonte
handler = getattr(sys.modules[__name__], myFnName)
Tente isso. Enquanto isso ainda usa eval, ele apenas a utiliza para convocar a função do contexto atual . Então, você tem a função real para usar como desejar.
O principal benefício para mim disso é que você receberá erros relacionados à avaliação no momento de convocar a função. Então você receberá apenas os erros relacionados à função quando ligar.
fonte
eval
menos que estritamente necessário.getattr(__module__, method_name)
é uma escolha muito melhor nesse contexto.nada do que foi sugerido me ajudou. Eu descobri isso embora.
Eu estou usando python 2.66
Espero que isto ajude
fonte
self.__getattribute__('title')
é igual aself.title
self.__getattribute__('title')
não funciona em nenhum caso (não sei por que) afinal, masfunc = getattr(self, 'title'); func();
funciona. Então, talvez seja melhor usar emgetattr()
vez dissogetattr
vez disso.Como esta pergunta Como chamar métodos dinamicamente dentro de uma classe usando a atribuição de nome do método para uma variável [duplicado] marcada como duplicada como esta, estou postando uma resposta relacionada aqui:
O cenário é que um método em uma classe deseja chamar outro método dinamicamente na mesma classe. Adicionei alguns detalhes ao exemplo original, que oferece um cenário e clareza mais amplos:
fonte
Esta é uma resposta simples, isso permitirá que você limpe a tela, por exemplo. Existem dois exemplos abaixo, com eval e exec, que imprimirão 0 na parte superior após a limpeza (se você estiver usando o Windows, mude
clear
paracls
, usuários de Linux e Mac saem como estão, por exemplo) ou apenas execute-o, respectivamente.fonte