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.

instância que usamos em InputData.read, mas com a vantagem serem válidos

para toda uma classe em vez de a cada um dos objetos individuais dela.

Implementando essa ideia nas classes de MapReduce, vemos no exemplo a

seguir como estender a classe InputData com um método genérico de classe que

será responsável pela criação das instâncias de InputData usando uma interface

comum a todas:

class GenericInputData(object):

def read(self):

raise NotImplementedError

@classmethod

def generate_inputs(cls, config):

raise NotImplementedError

Fizemos generate_inputs aceitar um dicionário com um conjunto de parâmetros

de configuração cuja interpretação é de responsabilidade da subclasse concreta

InputData. No exemplo a seguir, usou-se config para encontrar a pasta da qual

listaremos os arquivos de entrada:

class PathInputData(GenericInputData):

# ...

def read(self):

return open(self.path).read()

@classmethod

def generate_inputs(cls, config):

data_dir = config['data_dir']

for name in os.listdir(data_dir):

yield cls(os.path.join(data_dir, name))

Da mesma forma, podemos agregar a função auxiliar create_workers como parte

da classe GenericWorker. No exemplo a seguir, o parâmetro input_class, que

deve ser uma subclasse de GenericInputData, gera os dados necessários de

entrada. As instâncias da subclasse concreta GenericWorker são criadas usando

cls() como um construtor genérico.

class GenericWorker(object):

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!