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.

O comando nonlocal deixa claro que o dado está sendo atribuído em outro

escopo, fora do closure. É complementar ao comando global, que força a

definição da variável criada por atribuição diretamente no escopo global do

módulo.

Entretanto, da mesma forma que no antiexemplo das variáveis globais,

recomendamos usar nonlocal apenas para funções simples, nada mais! Os efeitos

colaterais de nonlocal podem ser difíceis de rastrear. É especialmente difícil

entendê-los em funções muito longas, porque o comando nonlocal, que reserva o

nome da variável, está a uma distância de muitas linhas do local onde essas

variáveis serão criadas por atribuição.

Quando o uso de nonlocal começa a complicar as coisas, é hora de envolver o

estado em uma função auxiliar. No exemplo a seguir, definimos uma classe que

produz o mesmo resultado que a solução com o nonlocal. É um pouquinho mais

longa, mas muito mais fácil de ler (consulte o Item 23: “Aceite funções para

interfaces simples em vez de classes” para mais detalhes sobre o método especial

__call__).

class Sorter(object):

def __init__(self, group):

self.group = group

self.found = False

def __call__(self, x):

if x in self.group:

self.found = True

return (0, x)

return (1, x)

sorter = Sorter(group)

numbers.sort(key=sorter)

assert sorter.found is True

Escopos no Python 2

Infelizmente, o Python 2 não suporta a palavra-chave nonlocal. Para conseguir o

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!