Eu sou um novato em python e estou tentando envolver minha cabeça em torno de decoradores de função em python. E eu não posso descobrir como funções funções retornam.
Quero dizer em que ordem faz intérprete interpreta esta função:
def decorator(another_func):
def wrapper():
print('before actual function')
return another_func()
print('pos')
return wrapper
E qual é a diferença entre estes 2 afirmações: -
return wrapper
E
return wrapper()
Eu estou usando Head First Python, mas este tema eu sinto não é descrito muito bem lá, por favor sugerir qualquer vídeo ou um bom recurso para que eu possa compreendê-lo.
Eu não consigo descobrir como funções funções retornam.
Como já foi explicado por LTheriault, em python tudo é um objeto. Não só isso, mas também tudo o que acontece em tempo de execução - a def
declaração é uma declaração executável, que cria um function
objeto a partir do código dentro do def
bloco e vincular esse objeto para o nome da função no namespace atual - IOW é principalmente açúcar sintático para algumas operações de você pode codificar manualmente (a muito bem-vindo açúcar sintático embora - a construção de um objeto de função "na mão" é bastante um monte de trabalho).
Nota que ter funções como "cidadãos de primeira classe" não é Python específica - que é a base da programação funcional .
Quero dizer em que ordem faz intérprete interpreta esta função:
def decorator(another_func):
def wrapper():
print('before actual function')
return another_func()
print('pos')
return wrapper
Assumindo que a decorator
função é declarada no módulo de nível superior: o tempo de execução primeiro leva o bloco de código que se segue à def
declaração, compila-lo em um code
objeto, cria um function
objeto (instância do tipo 'função') a partir deste code
objeto e algumas outras coisas ( a lista de argumentos etc) e, finalmente, se liga este objeto função para o nome declarado (nb: 'liga' => "atribui a").
O interior def
declaração é na verdade apenas executado quando a função exterior é chamado, e é executada de novo a cada vez que a função externa é chamado - IOW, cada chamada para decorator
retornos uma nova instância de função.
A explicação acima é, naturalmente, muito simplificado (daí parcialmente inexata), mas é o suficiente para entender o princípio básico.