Chamando uma função de um módulo usando seu nome (uma string)

Qual é a melhor maneira de chamar uma função dada uma string com o nome da função's nome em um programa Python. Por exemplo, deixe's dizer que eu tenho um módulo foo, e eu tenho uma string cujo conteúdo é "bar". Qual é a melhor maneira de chamar foo.bar()?

Eu preciso obter o valor de retorno da função, e é por isso que eu não'não uso apenas eval. Eu descobri como fazer isso usando eval para definir uma função temporária que retorna o resultado dessa chamada de função, mas eu'espero que haja uma maneira mais elegante de fazer isso.

Solução

Assumindo o módulo foo com o método bar:

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

Podias encurtar as linhas 2 e 3 para:

result = getattr(foo, 'bar')()

se isso fizer mais sentido para o seu caso de uso.

Você pode utilizar getattr desta forma em métodos vinculados a instâncias de classe, métodos em nível de módulo, métodos de classe... a lista continua.

Comentários (12)
locals()["myfunction"]()

ou

globals()["myfunction"]()

locais retorna um dicionário com uma tabela de símbolos local atual. globals retorna um dicionário com uma tabela de símbolos globais.

Comentários (4)

A solução do Patrick é provavelmente a mais limpa. Se você precisar pegar o módulo dinamicamente também, você pode importá-lo como:

module = __import__('foo')
func = getattr(module, 'bar')
func()
Comentários (6)