Olá pessoal!
A tradução do artigo foi preparada para os alunos do curso "Web-developer in Python" . É interessante desenvolver nessa direção? Inscreva-se no curso Open Doors Day e converse ao vivo com o professor: transmissão on - line em 23 de julho às 20:00, horário de Moscou!

Quando você praticou programação em Python, você deve ter se deparado com um conceito como decoradores. Eles são uma das ferramentas mais elegantes e frequentemente usadas em bibliotecas e estruturas modernas. Decoradores são uma boa maneira de encapsular muitos detalhes de implementação, deixando uma interface simples na superfície.
Vejamos um exemplo de um decorador de login simples que verifica se um usuário está logado antes de dar a ele a oportunidade de editar postagens. Em seguida, o decorador redireciona para a página de login ou registro e, com a ajuda dos parâmetros definidos corretamente, retorna à mesma página após a autenticação bem-sucedida. Para usar esta função, você só precisa escrever @login_required antes da função de destino.
@login_required def edit_post(post_id): ...
Os decoradores são muito fáceis de trabalhar, mas criar decoradores não é uma tarefa fácil, mesmo para programadores experientes em Python. Neste artigo, examinaremos passo a passo como os decoradores funcionam no Python.
Funções
As funções também são chamadas de objetos de primeira classe em Python. Funções são os mesmos valores que números, listas e cadeias, como visto no exemplo a seguir.
>>> def foo(): ... return 1 ... >>> >>> foo() 1 >>>
As funções têm seu próprio espaço para nome, onde procuram nomes de variáveis em primeiro lugar quando ocorrem no corpo de uma função. Vamos escrever uma função simples para entender a diferença entre o escopo global e o local.
>>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(locals()) ... >>> >>> print(globals()) {..., 'a_string': 'This is a global variable'} >>> >>> foo()
Escopo da função como uma variável
A regra de escopo no Python diz que, quando uma variável é criada, uma nova variável local sempre é criada, mas o acesso à variável é determinado no escopo local quando ele pesquisa em todas as áreas próximas por nomes de variáveis correspondentes. Isso não significa que não podemos acessar variáveis globais de nossa função. Para gerar uma variável global, alteramos a função foo da seguinte maneira:
>>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(a_string)
Vida útil variável
Não apenas as variáveis vivem no espaço para nome, mas também têm uma vida útil, o que é importante lembrar. Considere um exemplo que ilustra não apenas as regras de escopo e os problemas que elas podem causar, mas também como elas interagem com as chamadas de função e como elas funcionam em Python e outras linguagens.
>>> def foo(): ... x = 1 ... >>> foo() >>> >>> print(x)
Funções aninhadas
Você pode criar funções aninhadas no Python, o que significa que podemos declarar funções dentro de funções, e todas as regras de escopo e tempo de vida ainda se aplicam.
>>> >>> def outer(): ... x = 1 ... def inner(): ... print(x)
Decoradores
Um fechamento que recebe uma função como parâmetro e retorna uma função é chamado de decorador. Considere um exemplo de decoradores úteis.
>>> >>> def outer(some_func): ... def inner(): ... print("before some_func") ... ret = some_func()
Uma variável decorada é uma versão decorada de foo. De fato, poderíamos substituir foo por sua versão decorada e não aprender a nova sintaxe, simplesmente reatribuindo a variável que contém nossa função:
>>> >>> foo = outer(foo) >>> >>> foo
Agora temos um lindo decorador para rastrear chamadas de funções. Decoradores podem ser usados para trabalhar com qualquer linguagem de programação usando Python. Esta é uma ferramenta extremamente útil, cujo mecanismo de trabalho deve ser entendido para aplicá-las corretamente.