É possível declarar adiante uma função no Python? Quero classificar uma lista usando minha própria cmp
função antes de ser declarada.
print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])
Organizei meu código para colocar a definição de cmp_configs
método após a invocação. Falha com este erro:
NameError: name 'cmp_configs' is not defined
Existe alguma maneira de "declarar" o cmp_configs
método antes de ser usado? Isso faria meu código parecer mais limpo?
Suponho que algumas pessoas ficarão tentadas a me dizer que eu deveria reorganizar meu código para não ter esse problema. No entanto, há casos em que isso provavelmente é inevitável, por exemplo, ao implementar algumas formas de recursão. Se você não gostar deste exemplo, suponha que eu tenha um caso em que é realmente necessário encaminhar declarar uma função.
Considere este caso em que uma função de declaração direta seria necessária no Python:
def spam():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam()
Onde end_condition
e end_result
foram definidos anteriormente.
A única solução é reorganizar o código e sempre colocar definições antes das invocações?
fonte
main()
?import your_module
O que você pode fazer é envolver a invocação em uma função própria.
De modo a
vai quebrar, mas
estará funcionando corretamente.
A regra geral em não
Python
é que a função deva ser definida mais alto no código (como em ), mas que ela deve ser definida antes de seu uso.Pascal
Espero que ajude.
fonte
if __name__=="__main__":
solução funciona.Se você iniciar seu script com o seguinte:
então você provavelmente não precisa se preocupar com coisas como "declaração direta". Veja bem, o intérprete carregaria todas as suas funções e depois iniciaria a função principal (). Obviamente, verifique também se todas as importações estão corretas ;-)
Venha para pensar sobre isso, eu nunca ouvi algo como "declaração direta" em python ... mas, novamente, eu posso estar errado ;-)
fonte
Se a chamada para cmp_configs estiver dentro de sua própria definição de função, você deve estar bem. Eu vou dar um exemplo.
Em geral, colocar seu código dentro de funções (como main ()) resolverá seu problema; basta chamar main () no final do arquivo.
fonte
Peço desculpas por reviver esse tópico, mas houve uma estratégia não discutida aqui que pode ser aplicável.
Usando a reflexão, é possível fazer algo semelhante ao encaminhamento de declaração. Por exemplo, digamos que você tenha uma seção de código parecida com esta:
Portanto, dessa maneira, determinamos qual função queremos chamar antes que ela seja realmente definida, efetivamente uma declaração direta. Em python a declaração
globals()[function_name]()
é o mesmo quefoo()
sefunction_name = 'foo'
pelas razões discutidas acima, uma vez python deve pesquisar cada função antes de chamá-lo. Se alguém usar otimeit
módulo para ver como essas duas instruções se comparam, elas têm exatamente o mesmo custo computacional.É claro que o exemplo aqui é muito inútil, mas se alguém tiver uma estrutura complexa que precisa executar uma função, mas deve ser declarada antes (ou estruturalmente faz pouco sentido tê-la depois), pode-se simplesmente armazenar uma string e tente chamar a função mais tarde.
fonte
Não existe tal coisa em python como declaração direta. Você só precisa garantir que sua função seja declarada antes de ser necessária. Observe que o corpo de uma função não é interpretado até que a função seja executada.
Considere o seguinte exemplo:
Você pode pensar que o corpo de uma função é apenas outro script que será interpretado quando você chamar a função.
fonte
Não, não acredito que exista uma maneira de declarar uma função no Python.
Imagine que você é o intérprete Python. Quando você chega na linha
ou você sabe o que é cmp_configs ou não. Para continuar, você precisa conhecer o cmp_configs. Não importa se há recursão.
fonte
Às vezes, um algoritmo é mais fácil de entender de cima para baixo, começando com a estrutura geral e detalhando os detalhes.
Você pode fazer isso sem declarações avançadas:
fonte
Resultado:
fonte
Você não pode declarar adiante uma função no Python. Se você tem lógica executando antes de definir funções, provavelmente há algum problema. Coloque sua ação em um
if __name__ == '__main__'
no final do seu script (executando uma função denominada "main" se não for trivial) e seu código será mais modular e você poderá usá-lo como um módulo, se precisar. para.Além disso, substitua a compreensão dessa lista por um gerador expresso (ou seja,
print "\n".join(str(bla) for bla in sorted(mylist, cmp=cmp_configs))
)Além disso, não use
cmp
, que está obsoleto. Usekey
e forneça uma função menor que.fonte
Importe o próprio arquivo. Supondo que o arquivo seja chamado test.py:
fonte
"apenas reorganize meu código para não ter esse problema." Corrigir. Fácil de fazer. Sempre funciona.
Você sempre pode fornecer a função antes de sua referência.
"No entanto, há casos em que isso provavelmente é inevitável, por exemplo, ao implementar algumas formas de recursão"
Não vejo como isso é remotamente possível. Por favor, forneça um exemplo de um local onde você não pode definir a função antes de usá-la.
fonte
Agora espere um minuto. Quando seu módulo alcança a declaração de impressão em seu exemplo, antes de
cmp_configs
ser definido, o que exatamente você espera que ele faça?Se a postagem de uma pergunta usando print estiver realmente tentando representar algo como isto:
então não há nenhum requisito para definir
cmp_configs
antes de executar esta instrução, apenas defina-a posteriormente no código e tudo ficará bem.Agora, se você está tentando fazer referência
cmp_configs
como valor padrão de um argumento ao lambda, então esta é uma história diferente:Agora você precisa de uma
cmp_configs
variável definida antes de chegar a essa linha.[EDIT - esta próxima parte não está correta, pois o valor padrão do argumento será atribuído quando a função for compilada e esse valor será usado mesmo se você alterar o valor de cmp_configs posteriormente.]
Felizmente, o Python é tão complacente quanto o tipo, não se importa com o que você define
cmp_configs
, então você pode apenas prefaciar esta declaração:E o compilador ficará feliz. Apenas certifique-se de declarar o real
cmp_configs
antes de invocarfn
.fonte
Uma maneira é criar uma função de manipulador. Defina o manipulador desde o início e coloque-o abaixo de todos os métodos que você precisa chamar.
Então, quando você chamar o método manipulador para chamar suas funções, elas sempre estarão disponíveis.
O manipulador pode ter uma discussão
nameOfMethodToCall
. Em seguida, usa várias instruções if para chamar o método certo.Isso resolveria seu problema.
fonte
Sim, podemos verificar isso.
Entrada
Resultado
Como BJ Homer mencionou nos comentários acima, uma regra geral no Python não é que a função deva ser definida mais alto no código (como no Pascal), mas que ela deve ser definida antes de seu uso.
Espero que ajude.
fonte
print_lyrics()
chamado (usado) na linha 1 antes de ser definido? Copiei esse pedaço de código e tentei executá-lo, e isso me deu o erroNameError: name 'print_lyrics' is not defined
na Linha 1. Você pode explicar isso?