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.

self.added = 0

def __call__(self):

self.added += 1

return 0

counter = BetterCountMissing()

counter()

assert callable(counter)

No exemplo a seguir, usamos uma instância de BetterCountMissing como

gancho de valor default para um defaultdict de modo a registrar a quantidade de

chaves não encontradas que forem sendo adicionadas:

counter = BetterCountMissing()

result = defaultdict(counter, current) # Depende de __call__

for key, amount in increments:

result[key] += amount

assert counter.added == 2

Isso é muito mais claro que o exemplo anterior de CountMissing.missing. O

método __call__ indica que as instâncias da classe podem ser usadas em

qualquer lugar onde uma função seria apropriada (como ganchos de API) e

redireciona as pessoas que examinarem o código no futuro para o ponto de

entrada responsável pelo comportamento primário da classe. Além disso, é uma

dica muito forte de que o objetivo da classe é agir como um closure que

armazena seu estado (stateful).

O melhor de tudo é que defaultdict não tem como ver o que acontece em seu

código quando se usa __call__. Tudo o que defaultdict requer é uma função para

o gancho de valor default. O Python oferece muitas maneiras diferentes de

satisfazer uma interface funcional simples, dependendo do que for necessário

realizar.

Lembre-se

• Em vez de definir e instanciar classes, as funções são normalmente tudo o

que precisamos para interfaces simples entre componentes do Python.

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!