15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

mesmo comportamento, é preciso usar um artifício alternativo que tira proveito

das regras de escopo do Python. Esta técnica não é lá muito elegante, mas é

aceita como “politicamente correta” pelos programadores em Python.

# Python 2

def sort_priority(numbers, group):

found = [False]

def helper(x):

if x in group:

found[0] = True

return (0, x)

return (1, x)

numbers.sort(key=helper)

return found[0]

Como explicado anteriormente, o Python sai dos limites de escopo onde a

variável found é referenciada para resolver seu valor atual. O truque está no fato

de que o valor de found é uma lista, que é um tipo de dados mutável. Isso quer

dizer que, uma vez que seus valores tenham sido lidos, o closure pode modificar

o estado de found para enviar dados para fora do escopo interno (desde que

found[0] = True).

Essa técnica também funciona quando a variável usada para cruzar as fronteiras

de escopo é um dicionário, um conjunto, ou uma instância de uma classe

definida pelo programador.

Lembre-se

• As funções closure podem se referir a variáveis de qualquer um dos escopos

nas quais elas foram definidas.

• Por default, os closures não conseguem afetar as variáveis de escopos

hierarquicamente superiores ao seu.

• No Python 3, use o comando nonlocal para indicar quando um closure pode

modificar uma variável definida em escopos superiores.

• Em Python 2, use uma variável mutável (por exemplo, uma lista de um único

item) para contornar a ausência do comando nonlocal.

• Evite usar comandos nonlocal para funções complexas, use-as apenas em

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!