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.

# ...

def map(self):

raise NotImplementedError

def reduce(self, other):

raise NotImplementedError

@classmethod

def create_workers(cls, input_class, config):

workers = []

for input_data in input_class.generate_inputs(config):

workers.append(cls(input_data))

return workers

Observe que a chamada a input_class.generate_inputs no código anterior é a

demonstração do polimorfismo de classe. Podemos ver também como

create_workers, ao chamar cls, oferece uma maneira alternativa de construir

objetos GenericWorker sem usar o método __init__ diretamente.

O efeito em minha classe concreta GenericWorker não é nada complicado,

apenas uma mudança em sua classe ancestral.

class LineCountWorker(GenericWorker):

# ...

Por fim, podemos reescrever a função mapreduce de forma a torná-la

completamente genérica.

def mapreduce(worker_class, input_class, config):

workers = worker_class.create_workers(input_class, config)

return execute(workers)

Executar o novo Worker em um conjunto de arquivos de teste produz os mesmos

resultados da implementação antiga. A diferença é que a função mapreduce

requer mais parâmetros para que possa operar genericamente.

with TemporaryDirectory() as tmpdir:

write_test_files(tmpdir)

config = {'data_dir': tmpdir}

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!