Pular para o conteúdo

Como utilizar o método __repr__ Python?

[

Quando usar .repr() vs .str() em Python?

por Stephen Gruppetta Mar 22, 2023 0 Comentários boas práticas intermediário

Uma das tarefas mais comuns que um programa de computador realiza é exibir dados. O programa frequentemente exibe essas informações para o usuário do programa. No entanto, um programa também precisa mostrar informações ao programador que está desenvolvendo e mantendo-o. As informações que um programador precisa sobre um objeto diferem de como o programa deve exibir o mesmo objeto para o usuário, e é aí que entra o .__repr__() vs .__str__().

Um objeto Python tem vários métodos especiais que fornecem comportamentos específicos. Existem dois métodos especiais semelhantes que descrevem o objeto usando uma representação de string. Esses métodos são .__repr__() e .__str__(). O método .__repr__() retorna uma descrição detalhada para um programador que precisa manter e depurar o código. O método .__str__() retorna uma descrição mais simples com informações para o usuário do programa.

Os métodos .__repr__() e .__str__() são dois dos métodos especiais que você pode definir para qualquer classe. Eles permitem que você controle como um programa exibe um objeto em várias formas comuns de saída, como o resultado da função print(), strings formatadas e ambientes interativos.

Neste tutorial, você aprenderá como diferenciar .__repr__() vs .__str__() e como usar esses métodos especiais nas classes que você define. Definir esses métodos torna as classes que você escreve mais legíveis e mais fáceis de depurar e manter. Então, quando você deve escolher entre .__repr__() e .__str__() do Python?

Em resumo: Use .__repr__() para Programadores vs .__str__() para Usuários

Os métodos especiais .__repr__() e .__str__() retornam representações de string do objeto. Uma representação de string é uma string que mostra informações sobre o objeto. Você pode adaptar essas informações para diferentes públicos, como usuários do programa ou colegas programadores.

Como ocorre com outros métodos especiais com duplo sublinhado inicial e final em seus nomes, você pode definir esses métodos para qualquer classe.

A razão pela qual existem dois métodos para exibir um objeto é que eles têm propósitos diferentes:

  • .__repr__() fornece a representação de string oficial de um objeto, voltada para o programador.
  • .__str__() fornece a representação de string informal de um objeto, voltada para o usuário.

O público-alvo da representação de string retornada por .__repr__() é o programador que está desenvolvendo e mantendo o programa. Em geral, ela fornece informações detalhadas e inequívocas sobre o objeto. Outra propriedade importante da representação de string oficial é que um programador normalmente pode usá-la para recriar um objeto igual ao original.

O método .__str__() fornece uma representação de string direcionada ao usuário do programa, que pode não ser necessariamente um programador Python. Portanto, essa representação permite que qualquer usuário entenda informações básicas sobre o objeto.

Aqui está um exemplo que demonstra a diferença entre .__repr__() e .__str__():

class Ponto:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Ponto(x={self.x}, y={self.y})"
def __str__(self):
return f"({self.x}, {self.y})"
p = Ponto(2, 4)
print(p) # Saída: (2, 4)
print(repr(p)) # Saída: Ponto(x=2, y=4)

No exemplo acima, a chamada do método print(p) usa .__str__() para exibir o objeto p como uma string (2, 4). A chamada print(repr(p)) usa .__repr__() para exibir o mesmo objeto como uma string Ponto(x=2, y=4).

Como você pode acessar as representações de string de um objeto?

Agora que você sabe como diferenciar .__repr__() de .__str__(), como você pode acessar essas representações de string quando está trabalhando com um objeto em Python?

Existem várias maneiras de acessar as representações de string de um objeto:

  • Usando a função print(): Quando você chama print(obj), o Python verifica se o objeto tem um método .__str__() definido. Se tiver, ele usará esse método para exibir o objeto como uma string. Se o método .__str__() não estiver definido, o Python usará o método .__repr__() em vez disso.

  • Usando a função str(): Ao chamar str(obj), o Python procura por um método .__str__() no objeto e o utiliza para obter a representação de string. Se o método .__str__() não estiver definido, o Python recorrerá ao método .__repr__().

  • Usando a função repr(): Ao chamar repr(obj), o Python procurará por um método .__repr__() no objeto e o usará para obter a representação de string. O método .__str__() não é utilizado.

  • Usando formatação de string: Você pode usar as formatações de string do Python, como f"{}".format(obj), para exibir a representação de string de um objeto. O Python irá preferir o método .__str__() se estiver definido, senão, irá recorrer ao método .__repr__().

Aqui está um exemplo que mostra como acessar as representações de string de um objeto em diferentes contextos:

class Pessoa:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade
def __repr__(self):
return f"{self.__class__.__name__}('{self.nome}', {self.idade})"
def __str__(self):
return f"{self.nome} tem {self.idade} anos"
p = Pessoa("João", 25)
# Usando a função print()
print(p) # Saída: João tem 25 anos
# Usando a função str()
print(str(p)) # Saída: João tem 25 anos
# Usando a função repr()
print(repr(p)) # Saída: Pessoa('João', 25)
# Usando formatação de string
print(f"A pessoa é {p}") # Saída: A pessoa é João tem 25 anos

No exemplo acima, o objeto p é uma instância da classe Pessoa. Usando diferentes métodos e formatos, podemos obter a representação de string adequada para diferentes finalidades.

Devo definir .repr() e .str() em uma classe personalizada?

A definição dos métodos .__repr__() e .__str__() em uma classe personalizada é opcional. No entanto, é uma boa prática fornecer pelo menos uma dessas representações de string para que você possa exibir seus objetos de forma mais adequada em diferentes contextos.

Como mencionado anteriormente, .__repr__() é o método que o Python usa por padrão quando uma representação de string não é fornecida explicitamente. Portanto, é altamente recomendável definir pelo menos .__repr__() para todas as classes personalizadas. Isso garante que você tenha uma representação detalhada e inequívoca do objeto para depuração e manutenção do código.

Se você precisar fornecer uma representação de string mais legível e amigável para os usuários do seu programa, você também pode definir o método .__str__(). Isso permitirá que você exiba seus objetos de uma forma mais simplificada e compreensível para o usuário final.

Conclusão

Em resumo, os métodos .__repr__() e .__str__() fornecem maneiras de controlar como um objeto é exibido em forma de string em Python. A principal diferença entre eles é o público-alvo da representação de string. .__repr__() é voltado para programadores e fornece uma descrição detalhada e inequívoca do objeto. .__str__() é voltado para usuários do programa e fornece uma descrição mais simplificada e amigável.

Definir esses métodos em suas classes personalizadas permite que você forneça representações adequadas do objeto em diferentes contextos, como a função print() ou formatação de strings. Isso torna seus objetos mais legíveis, mais fáceis de depurar e mais fáceis de manter.

Em geral, você deve definir .__repr__() para todas as suas classes personalizadas e, se necessário, definir .__str__() para fornecer uma representação mais simplificada para os usuários finais de seu programa.

Entendendo a diferença entre .__repr__() e .__str__() e sabendo quando usá-los, você será capaz de criar classes mais eficazes e melhorar a qualidade do seu código Python.