Decoradores de função em Python

Poseidon Broger:

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.

bruno desthuilliers :

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 defdeclaração é uma declaração executável, que cria um functionobjeto a partir do código dentro do defbloco 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 decoratorfunção é declarada no módulo de nível superior: o tempo de execução primeiro leva o bloco de código que se segue à defdeclaração, compila-lo em um codeobjeto, cria um functionobjeto (instância do tipo 'função') a partir deste codeobjeto 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 defdeclaraçã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 decoratorretornos 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.

Acho que você gosta

Origin http://10.200.1.11:23101/article/api/json?id=384398&siteId=1
Recomendado
Clasificación