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.

dos passos.

def mapreduce(data_dir):

inputs = generate_inputs(data_dir)

workers = create_workers(inputs)

return execute(workers)

Rodar essa função em um conjunto de arquivos de teste funciona às mil

maravilhas.

from tempfile import TemporaryDirectory

def write_test_files(tmpdir):

# ...

with TemporaryDirectory() as tmpdir:

write_test_files(tmpdir)

result = mapreduce(tmpdir)

print('There are', result, 'lines')

>>>

There are 4360 lines

Se é tudo maravilhoso, onde está o problema? O grande senão é que a função

mapreduce não é nem um pouco genérica. Se quisermos escrever outra subclasse

de InputData ou Worker, precisaríamos reescrever as funções generate_inputs,

create_workers e mapreduce para que acompanhassem a mudança.

Esse problema revela a necessidade mais básica de se ter uma maneira genérica

de construir objetos. Em outras linguagens, resolveríamos o problema facilmente

com um construtor de polimorfismo, bastando obrigar cada subclasse de

InputData a providenciar um construtor especial que possa ser usado

genericamente pelos métodos auxiliares que orquestram o funcionamento do

programa principal MapReduce. Em Python, infelizmente, só temos um único

método construtor, o __init__. É totalmente fora de propósito exigir que cada

subclasse de InputData tenha um construtor compatível.

A melhor maneira de resolver o problema é empregar o polimorfismo de

@classmethod. Funciona da mesma maneira que o polimorfismo de método de

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!