1
resposta

Código final de "Transformando e Salvando Dados" apresenta erro

Meu código estava exatamente igual ao código presente na parte final do capítulo "Transformando e salvando dados" e faltava apenas apagar as partes comentadas, então copiei e colei o código mencionado. Ao tentar rodar o arquivo fusao_mercado_fev.py, o terminal do VS Code apresenta um erro que, de acordo com o material, não deveria existir.

Nas variáveis dados_empresaA e dados_empresaB, linhas 8 e 12 respectivamente, é utilizado Dados.leitura_dados(arquivo, 'formato') mas como o módulo leitura_dados foi definido como recebendo apenas self como argumento, ambas as variáveis apresentam TypeError: Dados.leitura_dados() takes 1 positional argument but 2 were given.

Posso apenas deixar Dados(path, type) em ambas as variáveis? Rodando dessa forma, o código não apresenta erros e os resultados estão corretos.

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Olá Matthews.
O erro ocorre porque o método leitura_dados() foi definido como um método de instância, ou seja, ele recebe apenas o parâmetro self.
Quando ele é chamado diretamente pela classe, como em Dados.leitura_dados(arquivo, 'formato'), o Python interpreta o primeiro argumento como se fosse o self, e o segundo argumento fica “sobrando”, gerando o erro de tipo (TypeError: Dados.leitura_dados() takes 1 positional argument but 2 were given).
Para corrigir isso, há duas formas possíveis:

  1. Instanciar a classe corretamente, como você fez:
    Se o construtor da classe (__init__) já faz a leitura dos dados, basta criar o objeto passando o caminho e o formato, assim:
    dados_empresaA = Dados(pathA, 'csv')
    dados_empresaB = Dados(pathB, 'json')
    Dessa forma, a leitura é feita durante a criação da instância, e o código funciona como esperado.

  2. Transformar o método em um método de classe ou estático, caso a intenção fosse chamá-lo diretamente pela classe:

    • Com @classmethod:

      @classmethod
      def leitura_dados(cls, arquivo, formato):
          ...
      
    • Ou com @staticmethod:

      @staticmethod
      def leitura_dados(arquivo, formato):
          ...
      

Assim, o método pode ser chamado diretamente por Dados.leitura_dados(arquivo, formato) sem causar erro.
Em resumo, a sua solução de usar Dados(path, type) está correta e coerente com o objetivo do código.
Essa abordagem segue o princípio da orientação a objetos, encapsulando a leitura dos dados dentro do próprio objeto.
Ela torna o código mais organizado e mais próximo do que se espera em um pipeline de dados bem estruturado.
Comente ai alguma duvida.
Bons estudos.