15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

if x in group:

found = True # Aqui o escopo é 'helper' -- e isso é

# catastrófico!

return (0, x)

return (1, x)

numbers.sort(key=helper)

return found

Esse problema é às vezes chamado de scoping bug ou falha de escopo porque

pode ser surpreendente para os programadores iniciantes. Porém, isso não é uma

falha – pelo contrário, é o resultado pretendido. Esse comportamento impede que

variáveis locais em uma função poluam o módulo que acondiciona tudo. Se não

fosse assim, cada atribuição dentro de uma função produziria lixo de variáveis

no escopo global do módulo. Além do ruído desnecessário, o efeito recíproco

das variáveis globais resultantes poderia causar falhas bastante obscuras.

Entregando dados ao mundo externo

No Python 3, existe uma sintaxe especial para extrair dados de um closure. O

comando nonlocal é usado para indicar que, em uma variável que tenha sido

definida por atribuição, o cruzamento de limites de escopo tem permissão para

acontecer em um nome de variável específico. O único fator limitante é que

nonlocal não ousará cruzar a fronteira com o escopo do módulo, evitando poluílo

com variáveis globais espúrias.

No exemplo a seguir, a mesma função é definida novamente usando nonlocal:

def sort_priority3(numbers, group):

found = False

def helper(x):

nonlocal found

if x in group:

found = True

return (0, x)

return (1, x)

numbers.sort(key=helper)

return found

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!